Human fetal trachea samples collected on Apr3. v3 chemistry.
library(Seurat)
library(dplyr)
ZipF<-list.files(path=".",pattern="*.gz",full.names = T,recursive = T)
ZipF
library(plyr)
library(R.utils)
ldply(.data=ZipF, .fun=gunzip) #This just unzips locally
##### First I manually changed all featurres.tsv to genes.tsv. Otherwise Read10X (Seurat v2) would not recognize.
# Load data
file_10Xdir_Hs<-c("GA21wk_v3","GA23wk_v3")
names(file_10Xdir_Hs)<-c("GA21wk_v3","GA23wk_v3")
Hs_Apr3_v3.data <- Read10X(data.dir = file_10Xdir_Hs)
dim(Hs_Apr3_v3.data)
26577 genes for HG38-plus
38892 “cells”/barcodes as filtered by Cell Ranger
Hs_GA2123_Trachea_v3@raw.data@Dim
[1] 22084 38892
head(Hs_GA2123_Trachea_v3@cell.names)
Hs_GA2123_Trachea_v3@data@Dim
[1] 22084 9693
cell_name<-read.table(text=Hs_GA2123_Trachea_v3@cell.names,sep="_",colClasses = "character")
age<-cell_name[,1]
names(age)<-Hs_GA2123_Trachea_v3@cell.names
Hs_GA2123_Trachea_v3<-AddMetaData(object = Hs_GA2123_Trachea_v3, metadata = age, col.name = "age")
table(Hs_GA2123_Trachea_v3@meta.data$age)
GA21wk GA23wk
7623 2070
ribo.genes <- grep(pattern = "^RP[SL][[:digit:]]", x = rownames(x = Hs_GA2123_Trachea_v3@data), value = TRUE)
percent.ribo <- Matrix::colSums(Hs_GA2123_Trachea_v3@raw.data[ribo.genes, ])/Matrix::colSums(Hs_GA2123_Trachea_v3@raw.data)
Hs_GA2123_Trachea_v3 <- AddMetaData(object = Hs_GA2123_Trachea_v3, metadata = percent.ribo, col.name = "percent.ribo")
Hs_GA2123_Trachea_v3 <- NormalizeData(object = Hs_GA2123_Trachea_v3)
Performing log-normalization
0% 10 20 30 40 50 60 70 80 90 100%
[----|----|----|----|----|----|----|----|----|----|
**************************************************|
Hs_GA2123_Trachea_v3 <- ScaleData(object = Hs_GA2123_Trachea_v3)
Scaling data matrix
|
| | 0%
|
|======= | 4%
|
|============= | 9%
|
|==================== | 13%
|
|=========================== | 17%
|
|================================= | 22%
|
|======================================== | 26%
|
|=============================================== | 30%
|
|====================================================== | 35%
|
|============================================================ | 39%
|
|=================================================================== | 43%
|
|========================================================================== | 48%
|
|================================================================================ | 52%
|
|======================================================================================= | 57%
|
|============================================================================================== | 61%
|
|==================================================================================================== | 65%
|
|=========================================================================================================== | 70%
|
|================================================================================================================== | 74%
|
|========================================================================================================================= | 78%
|
|=============================================================================================================================== | 83%
|
|====================================================================================================================================== | 87%
|
|============================================================================================================================================= | 91%
|
|=================================================================================================================================================== | 96%
|
|==========================================================================================================================================================| 100%
Hs_GA2123_Trachea_v3 <- FindVariableGenes(object = Hs_GA2123_Trachea_v3, do.plot = TRUE, x.low.cutoff=0.1,x.high.cutoff = Inf, y.cutoff = 0.5)
Calculating gene means
0% 10 20 30 40 50 60 70 80 90 100%
[----|----|----|----|----|----|----|----|----|----|
**************************************************|
Calculating gene variance to mean ratios
0% 10 20 30 40 50 60 70 80 90 100%
[----|----|----|----|----|----|----|----|----|----|
**************************************************|

Hs_GA2123_Trachea_v3 <- RunPCA(object = Hs_GA2123_Trachea_v3, do.print = FALSE)
Hs_GA2123_Trachea_v3 <- ProjectPCA(object = Hs_GA2123_Trachea_v3, do.print = FALSE)
PCHeatmap(object = Hs_GA2123_Trachea_v3, pc.use = 1:10, cells.use = 500, do.balanced = TRUE, label.columns = FALSE, num.genes = 25)

PCElbowPlot(object = Hs_GA2123_Trachea_v3)

n.pcs = 20
res.used <- 0.8
Hs_GA2123_Trachea_v3 <- FindClusters(object = Hs_GA2123_Trachea_v3, reduction.type = "pca", dims.use = 1:n.pcs,
resolution = res.used, print.output = 0, save.SNN = TRUE)
Hs_GA2123_Trachea_v3 <- RunTSNE(object = Hs_GA2123_Trachea_v3, dims.use = 1:n.pcs, seed.use = 10, perplexity=30, dim.embed = 2)

TSNEPlot(object = Hs_GA2123_Trachea_v3, do.label = F,group.by="age",pt.size = 0.1)

n.pcs = 20
res.used <- 1.0
Hs_GA2123_Trachea_v3 <- FindClusters(object = Hs_GA2123_Trachea_v3, reduction.type = "pca", dims.use = 1:n.pcs,
resolution = res.used, print.output = 0, save.SNN = TRUE,force.recalc=T)
Hs_GA2123_Trachea_v3 <- RunTSNE(object = Hs_GA2123_Trachea_v3, dims.use = 1:n.pcs, seed.use = 10, perplexity=30, dim.embed = 2,k.param=10)
TSNEPlot(object = Hs_GA2123_Trachea_v3, do.label = T,group.by="res.1")


Hs_GA2123_Trachea_v3<-SetAllIdent(Hs_GA2123_Trachea_v3,id="res.1")
GA2123wk_v3.res1.clust.markers <- FindAllMarkers(object = Hs_GA2123_Trachea_v3, only.pos = TRUE, min.pct = 0.25, thresh.use = 0.25)
GA2123wk_v3.res1.clust.markers %>% group_by(cluster) %>% top_n(20, avg_logFC)
write.table(GA2123wk_v3.res1.clust.markers,"GA2123wk_v3.res1.markers.txt",sep="\t")
Hs_v3_res1_8_18<-FindMarkers(Hs_GA2123_Trachea_v3,ident.1=c(8),ident.2=c(18),only.pos = F)
| | 0 % ~calculating
|+ | 1 % ~04s
|++ | 3 % ~04s
|++ | 4 % ~03s
|+++ | 5 % ~03s
|++++ | 6 % ~03s
|++++ | 8 % ~03s
|+++++ | 9 % ~03s
|++++++ | 10% ~03s
|++++++ | 11% ~03s
|+++++++ | 13% ~03s
|+++++++ | 14% ~03s
|++++++++ | 15% ~03s
|+++++++++ | 16% ~03s
|+++++++++ | 18% ~03s
|++++++++++ | 19% ~03s
|+++++++++++ | 20% ~03s
|+++++++++++ | 22% ~03s
|++++++++++++ | 23% ~03s
|+++++++++++++ | 24% ~03s
|+++++++++++++ | 25% ~03s
|++++++++++++++ | 27% ~03s
|++++++++++++++ | 28% ~03s
|+++++++++++++++ | 29% ~02s
|++++++++++++++++ | 30% ~02s
|++++++++++++++++ | 32% ~02s
|+++++++++++++++++ | 33% ~02s
|++++++++++++++++++ | 34% ~02s
|++++++++++++++++++ | 35% ~02s
|+++++++++++++++++++ | 37% ~02s
|+++++++++++++++++++ | 38% ~02s
|++++++++++++++++++++ | 39% ~02s
|+++++++++++++++++++++ | 41% ~02s
|+++++++++++++++++++++ | 42% ~02s
|++++++++++++++++++++++ | 43% ~02s
|+++++++++++++++++++++++ | 44% ~02s
|+++++++++++++++++++++++ | 46% ~02s
|++++++++++++++++++++++++ | 47% ~02s
|+++++++++++++++++++++++++ | 48% ~02s
|+++++++++++++++++++++++++ | 49% ~02s
|++++++++++++++++++++++++++ | 51% ~02s
|++++++++++++++++++++++++++ | 52% ~02s
|+++++++++++++++++++++++++++ | 53% ~02s
|++++++++++++++++++++++++++++ | 54% ~02s
|++++++++++++++++++++++++++++ | 56% ~02s
|+++++++++++++++++++++++++++++ | 57% ~02s
|++++++++++++++++++++++++++++++ | 58% ~01s
|++++++++++++++++++++++++++++++ | 59% ~01s
|+++++++++++++++++++++++++++++++ | 61% ~01s
|++++++++++++++++++++++++++++++++ | 62% ~01s
|++++++++++++++++++++++++++++++++ | 63% ~01s
|+++++++++++++++++++++++++++++++++ | 65% ~01s
|+++++++++++++++++++++++++++++++++ | 66% ~01s
|++++++++++++++++++++++++++++++++++ | 67% ~01s
|+++++++++++++++++++++++++++++++++++ | 68% ~01s
|+++++++++++++++++++++++++++++++++++ | 70% ~01s
|++++++++++++++++++++++++++++++++++++ | 71% ~01s
|+++++++++++++++++++++++++++++++++++++ | 72% ~01s
|+++++++++++++++++++++++++++++++++++++ | 73% ~01s
|++++++++++++++++++++++++++++++++++++++ | 75% ~01s
|++++++++++++++++++++++++++++++++++++++ | 76% ~01s
|+++++++++++++++++++++++++++++++++++++++ | 77% ~01s
|++++++++++++++++++++++++++++++++++++++++ | 78% ~01s
|++++++++++++++++++++++++++++++++++++++++ | 80% ~01s
|+++++++++++++++++++++++++++++++++++++++++ | 81% ~01s
|++++++++++++++++++++++++++++++++++++++++++ | 82% ~01s
|++++++++++++++++++++++++++++++++++++++++++ | 84% ~01s
|+++++++++++++++++++++++++++++++++++++++++++ | 85% ~01s
|++++++++++++++++++++++++++++++++++++++++++++ | 86% ~00s
|++++++++++++++++++++++++++++++++++++++++++++ | 87% ~00s
|+++++++++++++++++++++++++++++++++++++++++++++ | 89% ~00s
|+++++++++++++++++++++++++++++++++++++++++++++ | 90% ~00s
|++++++++++++++++++++++++++++++++++++++++++++++ | 91% ~00s
|+++++++++++++++++++++++++++++++++++++++++++++++ | 92% ~00s
|+++++++++++++++++++++++++++++++++++++++++++++++ | 94% ~00s
|++++++++++++++++++++++++++++++++++++++++++++++++ | 95% ~00s
|+++++++++++++++++++++++++++++++++++++++++++++++++ | 96% ~00s
|+++++++++++++++++++++++++++++++++++++++++++++++++ | 97% ~00s
|++++++++++++++++++++++++++++++++++++++++++++++++++| 99% ~00s
|++++++++++++++++++++++++++++++++++++++++++++++++++| 100% elapsed = 04s
Hs_v3_res1_8_18
Hs_v3_res1_2over1<-FindMarkers(Hs_GA2123_Trachea_v3,ident.1=c(2),ident.2=c(1),only.pos = T)
| | 0 % ~calculating
|+ | 2 % ~03s
|++ | 4 % ~03s
|+++ | 6 % ~03s
|++++ | 8 % ~03s
|+++++ | 10% ~03s
|++++++ | 12% ~02s
|+++++++ | 13% ~02s
|++++++++ | 15% ~02s
|+++++++++ | 17% ~02s
|++++++++++ | 19% ~02s
|+++++++++++ | 21% ~02s
|++++++++++++ | 23% ~02s
|+++++++++++++ | 25% ~02s
|++++++++++++++ | 27% ~02s
|+++++++++++++++ | 29% ~02s
|++++++++++++++++ | 31% ~02s
|+++++++++++++++++ | 33% ~02s
|++++++++++++++++++ | 35% ~02s
|+++++++++++++++++++ | 37% ~02s
|++++++++++++++++++++ | 38% ~02s
|+++++++++++++++++++++ | 40% ~02s
|++++++++++++++++++++++ | 42% ~02s
|+++++++++++++++++++++++ | 44% ~02s
|++++++++++++++++++++++++ | 46% ~02s
|+++++++++++++++++++++++++ | 48% ~01s
|+++++++++++++++++++++++++ | 50% ~01s
|++++++++++++++++++++++++++ | 52% ~01s
|+++++++++++++++++++++++++++ | 54% ~01s
|++++++++++++++++++++++++++++ | 56% ~01s
|+++++++++++++++++++++++++++++ | 58% ~01s
|++++++++++++++++++++++++++++++ | 60% ~01s
|+++++++++++++++++++++++++++++++ | 62% ~01s
|++++++++++++++++++++++++++++++++ | 63% ~01s
|+++++++++++++++++++++++++++++++++ | 65% ~01s
|++++++++++++++++++++++++++++++++++ | 67% ~01s
|+++++++++++++++++++++++++++++++++++ | 69% ~01s
|++++++++++++++++++++++++++++++++++++ | 71% ~01s
|+++++++++++++++++++++++++++++++++++++ | 73% ~01s
|++++++++++++++++++++++++++++++++++++++ | 75% ~01s
|+++++++++++++++++++++++++++++++++++++++ | 77% ~01s
|++++++++++++++++++++++++++++++++++++++++ | 79% ~01s
|+++++++++++++++++++++++++++++++++++++++++ | 81% ~01s
|++++++++++++++++++++++++++++++++++++++++++ | 83% ~00s
|+++++++++++++++++++++++++++++++++++++++++++ | 85% ~00s
|++++++++++++++++++++++++++++++++++++++++++++ | 87% ~00s
|+++++++++++++++++++++++++++++++++++++++++++++ | 88% ~00s
|++++++++++++++++++++++++++++++++++++++++++++++ | 90% ~00s
|+++++++++++++++++++++++++++++++++++++++++++++++ | 92% ~00s
|++++++++++++++++++++++++++++++++++++++++++++++++ | 94% ~00s
|+++++++++++++++++++++++++++++++++++++++++++++++++ | 96% ~00s
|++++++++++++++++++++++++++++++++++++++++++++++++++| 98% ~00s
|++++++++++++++++++++++++++++++++++++++++++++++++++| 100% elapsed = 03s
Hs_v3_res1_2over1
Hs_v3_res1_21_20<-FindMarkers(Hs_GA2123_Trachea_v3,ident.1=c(21),ident.2=c(20),only.pos = T)
| | 0 % ~calculating
|+ | 1 % ~03s
|++ | 2 % ~03s
|++ | 3 % ~03s
|+++ | 4 % ~03s
|+++ | 5 % ~03s
|++++ | 6 % ~03s
|++++ | 7 % ~03s
|+++++ | 8 % ~03s
|+++++ | 9 % ~03s
|++++++ | 10% ~03s
|++++++ | 11% ~02s
|+++++++ | 12% ~02s
|+++++++ | 14% ~02s
|++++++++ | 15% ~02s
|++++++++ | 16% ~02s
|+++++++++ | 17% ~02s
|+++++++++ | 18% ~02s
|++++++++++ | 19% ~03s
|++++++++++ | 20% ~03s
|+++++++++++ | 21% ~03s
|+++++++++++ | 22% ~03s
|++++++++++++ | 23% ~03s
|++++++++++++ | 24% ~03s
|+++++++++++++ | 25% ~03s
|++++++++++++++ | 26% ~02s
|++++++++++++++ | 27% ~02s
|+++++++++++++++ | 28% ~02s
|+++++++++++++++ | 29% ~02s
|++++++++++++++++ | 30% ~02s
|++++++++++++++++ | 31% ~02s
|+++++++++++++++++ | 32% ~02s
|+++++++++++++++++ | 33% ~02s
|++++++++++++++++++ | 34% ~02s
|++++++++++++++++++ | 35% ~02s
|+++++++++++++++++++ | 36% ~02s
|+++++++++++++++++++ | 38% ~02s
|++++++++++++++++++++ | 39% ~02s
|++++++++++++++++++++ | 40% ~02s
|+++++++++++++++++++++ | 41% ~02s
|+++++++++++++++++++++ | 42% ~02s
|++++++++++++++++++++++ | 43% ~02s
|++++++++++++++++++++++ | 44% ~02s
|+++++++++++++++++++++++ | 45% ~02s
|+++++++++++++++++++++++ | 46% ~02s
|++++++++++++++++++++++++ | 47% ~02s
|++++++++++++++++++++++++ | 48% ~02s
|+++++++++++++++++++++++++ | 49% ~02s
|+++++++++++++++++++++++++ | 50% ~02s
|++++++++++++++++++++++++++ | 51% ~02s
|+++++++++++++++++++++++++++ | 52% ~01s
|+++++++++++++++++++++++++++ | 53% ~02s
|++++++++++++++++++++++++++++ | 54% ~02s
|++++++++++++++++++++++++++++ | 55% ~02s
|+++++++++++++++++++++++++++++ | 56% ~02s
|+++++++++++++++++++++++++++++ | 57% ~01s
|++++++++++++++++++++++++++++++ | 58% ~01s
|++++++++++++++++++++++++++++++ | 59% ~01s
|+++++++++++++++++++++++++++++++ | 60% ~01s
|+++++++++++++++++++++++++++++++ | 61% ~01s
|++++++++++++++++++++++++++++++++ | 62% ~01s
|++++++++++++++++++++++++++++++++ | 64% ~01s
|+++++++++++++++++++++++++++++++++ | 65% ~01s
|+++++++++++++++++++++++++++++++++ | 66% ~01s
|++++++++++++++++++++++++++++++++++ | 67% ~01s
|++++++++++++++++++++++++++++++++++ | 68% ~01s
|+++++++++++++++++++++++++++++++++++ | 69% ~01s
|+++++++++++++++++++++++++++++++++++ | 70% ~01s
|++++++++++++++++++++++++++++++++++++ | 71% ~01s
|++++++++++++++++++++++++++++++++++++ | 72% ~01s
|+++++++++++++++++++++++++++++++++++++ | 73% ~01s
|+++++++++++++++++++++++++++++++++++++ | 74% ~01s
|++++++++++++++++++++++++++++++++++++++ | 75% ~01s
|+++++++++++++++++++++++++++++++++++++++ | 76% ~01s
|+++++++++++++++++++++++++++++++++++++++ | 77% ~01s
|++++++++++++++++++++++++++++++++++++++++ | 78% ~01s
|++++++++++++++++++++++++++++++++++++++++ | 79% ~01s
|+++++++++++++++++++++++++++++++++++++++++ | 80% ~01s
|+++++++++++++++++++++++++++++++++++++++++ | 81% ~01s
|++++++++++++++++++++++++++++++++++++++++++ | 82% ~01s
|++++++++++++++++++++++++++++++++++++++++++ | 83% ~01s
|+++++++++++++++++++++++++++++++++++++++++++ | 84% ~01s
|+++++++++++++++++++++++++++++++++++++++++++ | 85% ~00s
|++++++++++++++++++++++++++++++++++++++++++++ | 86% ~00s
|++++++++++++++++++++++++++++++++++++++++++++ | 88% ~00s
|+++++++++++++++++++++++++++++++++++++++++++++ | 89% ~00s
|+++++++++++++++++++++++++++++++++++++++++++++ | 90% ~00s
|++++++++++++++++++++++++++++++++++++++++++++++ | 91% ~00s
|++++++++++++++++++++++++++++++++++++++++++++++ | 92% ~00s
|+++++++++++++++++++++++++++++++++++++++++++++++ | 93% ~00s
|+++++++++++++++++++++++++++++++++++++++++++++++ | 94% ~00s
|++++++++++++++++++++++++++++++++++++++++++++++++ | 95% ~00s
|++++++++++++++++++++++++++++++++++++++++++++++++ | 96% ~00s
|+++++++++++++++++++++++++++++++++++++++++++++++++ | 97% ~00s
|+++++++++++++++++++++++++++++++++++++++++++++++++ | 98% ~00s
|++++++++++++++++++++++++++++++++++++++++++++++++++| 99% ~00s
|++++++++++++++++++++++++++++++++++++++++++++++++++| 100% elapsed = 03s
Hs_v3_res1_21_20
n.pcs = 20
res.used <- 1.2
Hs_GA2123_Trachea_v3 <- FindClusters(object = Hs_GA2123_Trachea_v3, reduction.type = "pca", dims.use = 1:n.pcs,
resolution = res.used, print.output = 0, save.SNN = TRUE)
Build parameters exactly match those of already computed and stored SNN. To force recalculation, set force.recalc to TRUE.
Hs_GA2123_Trachea_v3 <- RunTSNE(object = Hs_GA2123_Trachea_v3, dims.use = 1:n.pcs, seed.use = 10, perplexity=30, dim.embed = 2,k.param=10)
TSNEPlot(object = Hs_GA2123_Trachea_v3, do.label = T,group.by="res.1.2")

n.pcs = 20
res.used <- 1.4
Hs_GA2123_Trachea_v3 <- FindClusters(object = Hs_GA2123_Trachea_v3, reduction.type = "pca", dims.use = 1:n.pcs,
resolution = res.used, print.output = 0, save.SNN = TRUE)
Build parameters exactly match those of already computed and stored SNN. To force recalculation, set force.recalc to TRUE.
Hs_GA2123_Trachea_v3 <- RunTSNE(object = Hs_GA2123_Trachea_v3, dims.use = 1:n.pcs, seed.use = 10, perplexity=30, dim.embed = 2,k.param=10)
TSNEPlot(object = Hs_GA2123_Trachea_v3, do.label = T,group.by="res.1.4")

sum(is.na(Hs_GA2123_Trachea_v3@meta.data$doublet_score))
[1] 0
Hs_GA2123_Trachea_v3<-SetAllIdent(Hs_GA2123_Trachea_v3,id="age")
VlnPlot(object = Hs_GA2123_Trachea_v3, features.plot = c("doublet_score"), nCol = 1,group.by="res.1.4",point.size.use=0.3,ident.include = "GA21wk")



VlnPlot(object = Hs_GA2123_Trachea_v3, features.plot = c("SOX10","PHOX2A", "PHOX2B","CHGA","ASCL1","RET"), nCol = 1,group.by="res.1.4",point.size.use=0.3)
DoHeatmap(object = Hs_GA2123_Trachea_v3, genes.use = c("EPCAM","TUBB3","SNAP25","ASCL1","CHGA","PHOX2A","PHOX2B","PLP1","MPZ"),
slim.col.label = TRUE, group.label.rot = TRUE,use.scaled = T,group.by="res.1.4",group.cex = 35,cex.row=25,cells.use = Hs_GA2123_Trachea_v3@cell.names[Hs_GA2123_Trachea_v3@meta.data$res.1.4 %in% c(10)]
)
subset the Non-EPCAM cells:
Hs_GA2123_Trachea_v3 <- SetAllIdent(object = Hs_GA2123_Trachea_v3, id = "res.1.4")
Hs_GA2123_Trachea_v3_nonEpcam<-SubsetData(object=Hs_GA2123_Trachea_v3,ident.use=c(0:7,9:13,15,16,18,20:24))
table(Hs_GA2123_Trachea_v3_nonEpcam@meta.data$res.1.4)
0 1 10 11 12 13 15 16 18 2 20 21 22 23 24 3 4 5 6 7 9
937 862 405 401 370 351 316 290 248 825 189 121 90 88 65 550 481 476 461 447 414
colnames(Hs_GA2123_Trachea_v3_nonEpcam@meta.data)[colnames(Hs_GA2123_Trachea_v3_nonEpcam@meta.data) == 'res.0.8'] <- 'orig.0.8'
colnames(Hs_GA2123_Trachea_v3_nonEpcam@meta.data)[colnames(Hs_GA2123_Trachea_v3_nonEpcam@meta.data) == 'res.1.4'] <- 'orig.1.4'
colnames(Hs_GA2123_Trachea_v3_nonEpcam@meta.data)[colnames(Hs_GA2123_Trachea_v3_nonEpcam@meta.data) == 'res.1.2'] <- 'orig.1.2'
Hs_GA2123_Trachea_v3_nonEpcam <- ScaleData(object = Hs_GA2123_Trachea_v3_nonEpcam)
Scaling data matrix
|
| | 0%
|
|====== | 4%
|
|============ | 9%
|
|================== | 13%
|
|======================== | 17%
|
|============================== | 22%
|
|=================================== | 26%
|
|========================================= | 30%
|
|=============================================== | 35%
|
|===================================================== | 39%
|
|=========================================================== | 43%
|
|================================================================= | 48%
|
|======================================================================= | 52%
|
|============================================================================= | 57%
|
|=================================================================================== | 61%
|
|========================================================================================= | 65%
|
|=============================================================================================== | 70%
|
|===================================================================================================== | 74%
|
|========================================================================================================== | 78%
|
|================================================================================================================ | 83%
|
|====================================================================================================================== | 87%
|
|============================================================================================================================ | 91%
|
|================================================================================================================================== | 96%
|
|========================================================================================================================================| 100%
Hs_GA2123_Trachea_v3_nonEpcam <- FindVariableGenes(object = Hs_GA2123_Trachea_v3_nonEpcam, do.plot = TRUE, x.low.cutoff=0.1,x.high.cutoff = Inf, y.cutoff = 0.5)
Calculating gene means
0% 10 20 30 40 50 60 70 80 90 100%
[----|----|----|----|----|----|----|----|----|----|
**************************************************|
Calculating gene variance to mean ratios
0% 10 20 30 40 50 60 70 80 90 100%
[----|----|----|----|----|----|----|----|----|----|
**************************************************|

run PCA on the set of genes
Hs_GA2123_Trachea_v3_nonEpcam <- RunPCA(object = Hs_GA2123_Trachea_v3_nonEpcam, do.print = FALSE)
#PCAPlot(Hs_GA2123_Trachea_v3_nonEpcam)
Hs_GA2123_Trachea_v3_nonEpcam <- ProjectPCA(object = Hs_GA2123_Trachea_v3_nonEpcam, do.print = F)
PCElbowPlot(object = Hs_GA2123_Trachea_v3_nonEpcam)

PCHeatmap(object = Hs_GA2123_Trachea_v3_nonEpcam, pc.use = 1:20, cells.use = 500, do.balanced = TRUE, label.columns = FALSE, num.genes = 25)

n.pcs = 20
res.used <- 0.8
Hs_GA2123_Trachea_v3_nonEpcam <- FindClusters(object = Hs_GA2123_Trachea_v3_nonEpcam, reduction.type = "pca", dims.use = 1:n.pcs,
resolution = res.used, print.output = 0, save.SNN = TRUE)
Build parameters exactly match those of already computed and stored SNN. To force recalculation, set force.recalc to TRUE.Clustering parameters for resolution 0.8 exactly match those of already computed.
To force recalculation, set force.recalc to TRUE.
Hs_GA2123_Trachea_v3_nonEpcam <- RunTSNE(object = Hs_GA2123_Trachea_v3_nonEpcam, dims.use = 1:n.pcs, seed.use = 10, perplexity=30, dim.embed = 2,k.param=10)
TSNEPlot(object = Hs_GA2123_Trachea_v3_nonEpcam, do.label = T,group.by="res.0.8")


table(Hs_GA2123_Trachea_v3_nonEpcam@meta.data$orig.1.4,Hs_GA2123_Trachea_v3_nonEpcam@meta.data$res.0.8)
0 1 10 11 12 13 14 15 16 17 2 3 4 5 6 7 8 9
0 917 10 0 0 0 1 1 0 0 0 0 4 4 0 0 0 0 0
1 13 739 65 18 5 10 0 0 0 0 0 11 0 0 0 1 0 0
10 2 0 0 1 0 0 0 0 0 0 0 0 1 0 0 0 0 401
11 0 0 0 1 1 0 0 1 0 0 396 0 0 0 1 1 0 0
12 0 9 0 313 47 0 0 0 0 0 0 0 0 0 0 1 0 0
13 11 5 1 0 3 0 0 0 0 0 0 0 329 1 0 1 0 0
15 0 22 274 0 3 0 0 0 0 0 0 16 0 0 0 1 0 0
16 0 9 5 4 256 0 1 0 0 0 0 0 0 0 13 0 2 0
18 1 17 1 0 0 227 0 1 0 0 0 0 0 0 0 0 0 1
2 15 37 30 0 0 0 0 0 0 0 0 743 0 0 0 0 0 0
20 0 0 0 0 0 0 0 0 0 0 0 0 4 184 0 0 1 0
21 5 0 0 0 0 0 115 0 0 0 0 0 0 0 0 1 0 0
22 0 0 0 0 0 0 0 1 85 0 0 0 0 0 4 0 0 0
23 0 0 0 0 0 0 0 88 0 0 0 0 0 0 0 0 0 0
24 0 0 0 0 0 0 0 0 0 65 0 0 0 0 0 0 0 0
3 0 0 0 0 0 0 0 0 1 0 0 0 0 0 542 7 0 0
4 5 3 1 0 0 0 0 0 0 0 0 4 0 3 0 463 1 1
5 1 4 1 1 2 1 0 3 5 0 0 1 1 0 6 1 449 0
6 0 0 0 0 0 0 0 0 0 0 0 0 4 457 0 0 0 0
7 19 0 0 0 0 0 0 0 0 0 0 0 414 12 0 1 1 0
9 0 0 0 0 0 0 0 0 0 0 414 0 0 0 0 0 0 0
library(ggalluvial)
ggplot(data=Hs_GA2123_Trachea_v3_nonEpcam@meta.data,aes(axis1=orig.1.4,axis2=res.0.8))+geom_alluvium(aes(fill=res.0.8))+geom_stratum(width = 1/12, fill = "black", color = "grey") +geom_label(stat = "stratum", label.strata = TRUE)+scale_x_discrete(limits = c("orig.1.4", "res.0.8"), expand = c(.05, .05))

Now subset the basal, ciliated, and secretory:
Hs_GA2123_Trachea_v3 <- SetAllIdent(object = Hs_GA2123_Trachea_v3, id = "res.1.4")
Hs_GA2123_Trachea_v3_sub1<-SubsetData(object=Hs_GA2123_Trachea_v3,ident.use=c(8,14,19))
table(Hs_GA2123_Trachea_v3_sub1@meta.data$res.1.4)
colnames(Hs_GA2123_Trachea_v3_sub1@meta.data)[colnames(Hs_GA2123_Trachea_v3_sub1@meta.data) == 'res.0.8'] <- 'orig.0.8'
colnames(Hs_GA2123_Trachea_v3_sub1@meta.data)[colnames(Hs_GA2123_Trachea_v3_sub1@meta.data) == 'res.1.4'] <- 'orig.1.4'
colnames(Hs_GA2123_Trachea_v3_sub1@meta.data)[colnames(Hs_GA2123_Trachea_v3_sub1@meta.data) == 'res.1.2'] <- 'orig.1.2'
Hs_GA2123_Trachea_v3_sub1 <- ScaleData(object = Hs_GA2123_Trachea_v3_sub1)
Scaling data matrix
|
| | 0%
|
|===============================================================================================================| 100%
Hs_GA2123_Trachea_v3_sub1 <- FindVariableGenes(object = Hs_GA2123_Trachea_v3_sub1, do.plot = TRUE, x.low.cutoff=0.1,x.high.cutoff = Inf, y.cutoff = 0.5)
Calculating gene means
0% 10 20 30 40 50 60 70 80 90 100%
[----|----|----|----|----|----|----|----|----|----|
**************************************************|
Calculating gene variance to mean ratios
0% 10 20 30 40 50 60 70 80 90 100%
[----|----|----|----|----|----|----|----|----|----|
**************************************************|

run PCA on the set of genes
Hs_GA2123_Trachea_v3_sub1 <- RunPCA(object = Hs_GA2123_Trachea_v3_sub1, do.print = FALSE)
#PCAPlot(Hs_GA2123_Trachea_v3_sub1)
Hs_GA2123_Trachea_v3_sub1 <- ProjectPCA(object = Hs_GA2123_Trachea_v3_sub1, do.print = F)
PCElbowPlot(object = Hs_GA2123_Trachea_v3_sub1)

PCHeatmap(object = Hs_GA2123_Trachea_v3_sub1, pc.use = 1:12, cells.use = 500, do.balanced = TRUE, label.columns = FALSE, num.genes = 25)

n.pcs = 16
res.used <- 0.8
Hs_GA2123_Trachea_v3_sub1 <- FindClusters(object = Hs_GA2123_Trachea_v3_sub1, reduction.type = "pca", dims.use = 1:n.pcs,
resolution = res.used, print.output = 0, save.SNN = TRUE)
Hs_GA2123_Trachea_v3_sub1 <- RunTSNE(object = Hs_GA2123_Trachea_v3_sub1, dims.use = 1:n.pcs, seed.use = 10, perplexity=30, dim.embed = 2,k.param=10)
TSNEPlot(object = Hs_GA2123_Trachea_v3_sub1, do.label = T)



prop.table(table(Hs_GA2123_Trachea_v3_sub1@meta.data$age,Hs_GA2123_Trachea_v3_sub1@meta.data$res.0.8),1)
0 1 2 3 4 5 6 7
GA21wk 0.18484848 0.20303030 0.08333333 0.16818182 0.19090909 0.06363636 0.06060606 0.04545455
GA23wk 0.18333333 0.10000000 0.31111111 0.10833333 0.05277778 0.12500000 0.06388889 0.05555556
n.pcs = 16
res.used <- 1.2
Hs_GA2123_Trachea_v3_sub1 <- FindClusters(object = Hs_GA2123_Trachea_v3_sub1, reduction.type = "pca", dims.use = 1:n.pcs,
resolution = res.used, print.output = 0, save.SNN = TRUE)
Build parameters exactly match those of already computed and stored SNN. To force recalculation, set force.recalc to TRUE.
Hs_GA2123_Trachea_v3_sub1 <- RunTSNE(object = Hs_GA2123_Trachea_v3_sub1, dims.use = 1:n.pcs, seed.use = 10, perplexity=30, dim.embed = 2,k.param=10)


Hs_v3_sub1_res1.2_c8over2_4<-FindMarkers(Hs_GA2123_Trachea_v3_sub1,ident.1=c(8),ident.2 = c(2,4),only.pos = TRUE)
| | 0 % ~calculating
|+ | 1 % ~16s
|++ | 2 % ~10s
|++ | 4 % ~07s
|+++ | 5 % ~06s
|++++ | 6 % ~05s
|++++ | 8 % ~04s
|+++++ | 9 % ~04s
|+++++ | 10% ~04s
|++++++ | 11% ~03s
|+++++++ | 12% ~03s
|+++++++ | 14% ~03s
|++++++++ | 15% ~03s
|+++++++++ | 16% ~03s
|+++++++++ | 18% ~03s
|++++++++++ | 19% ~03s
|++++++++++ | 20% ~02s
|+++++++++++ | 21% ~02s
|++++++++++++ | 22% ~02s
|++++++++++++ | 24% ~02s
|+++++++++++++ | 25% ~02s
|++++++++++++++ | 26% ~02s
|++++++++++++++ | 28% ~02s
|+++++++++++++++ | 29% ~02s
|+++++++++++++++ | 30% ~02s
|++++++++++++++++ | 31% ~02s
|+++++++++++++++++ | 32% ~02s
|+++++++++++++++++ | 34% ~02s
|++++++++++++++++++ | 35% ~02s
|+++++++++++++++++++ | 36% ~02s
|+++++++++++++++++++ | 38% ~02s
|++++++++++++++++++++ | 39% ~02s
|++++++++++++++++++++ | 40% ~02s
|+++++++++++++++++++++ | 41% ~02s
|++++++++++++++++++++++ | 42% ~02s
|++++++++++++++++++++++ | 44% ~02s
|+++++++++++++++++++++++ | 45% ~02s
|++++++++++++++++++++++++ | 46% ~01s
|++++++++++++++++++++++++ | 48% ~01s
|+++++++++++++++++++++++++ | 49% ~01s
|+++++++++++++++++++++++++ | 50% ~01s
|++++++++++++++++++++++++++ | 51% ~01s
|+++++++++++++++++++++++++++ | 52% ~01s
|+++++++++++++++++++++++++++ | 54% ~01s
|++++++++++++++++++++++++++++ | 55% ~01s
|+++++++++++++++++++++++++++++ | 56% ~01s
|+++++++++++++++++++++++++++++ | 58% ~01s
|++++++++++++++++++++++++++++++ | 59% ~01s
|++++++++++++++++++++++++++++++ | 60% ~01s
|+++++++++++++++++++++++++++++++ | 61% ~01s
|++++++++++++++++++++++++++++++++ | 62% ~01s
|++++++++++++++++++++++++++++++++ | 64% ~01s
|+++++++++++++++++++++++++++++++++ | 65% ~01s
|++++++++++++++++++++++++++++++++++ | 66% ~01s
|++++++++++++++++++++++++++++++++++ | 68% ~01s
|+++++++++++++++++++++++++++++++++++ | 69% ~01s
|+++++++++++++++++++++++++++++++++++ | 70% ~01s
|++++++++++++++++++++++++++++++++++++ | 71% ~01s
|+++++++++++++++++++++++++++++++++++++ | 72% ~01s
|+++++++++++++++++++++++++++++++++++++ | 74% ~01s
|++++++++++++++++++++++++++++++++++++++ | 75% ~01s
|+++++++++++++++++++++++++++++++++++++++ | 76% ~01s
|+++++++++++++++++++++++++++++++++++++++ | 78% ~01s
|++++++++++++++++++++++++++++++++++++++++ | 79% ~01s
|++++++++++++++++++++++++++++++++++++++++ | 80% ~00s
|+++++++++++++++++++++++++++++++++++++++++ | 81% ~00s
|++++++++++++++++++++++++++++++++++++++++++ | 82% ~00s
|++++++++++++++++++++++++++++++++++++++++++ | 84% ~00s
|+++++++++++++++++++++++++++++++++++++++++++ | 85% ~00s
|++++++++++++++++++++++++++++++++++++++++++++ | 86% ~00s
|++++++++++++++++++++++++++++++++++++++++++++ | 88% ~00s
|+++++++++++++++++++++++++++++++++++++++++++++ | 89% ~00s
|+++++++++++++++++++++++++++++++++++++++++++++ | 90% ~00s
|++++++++++++++++++++++++++++++++++++++++++++++ | 91% ~00s
|+++++++++++++++++++++++++++++++++++++++++++++++ | 92% ~00s
|+++++++++++++++++++++++++++++++++++++++++++++++ | 94% ~00s
|++++++++++++++++++++++++++++++++++++++++++++++++ | 95% ~00s
|+++++++++++++++++++++++++++++++++++++++++++++++++ | 96% ~00s
|+++++++++++++++++++++++++++++++++++++++++++++++++ | 98% ~00s
|++++++++++++++++++++++++++++++++++++++++++++++++++| 99% ~00s
|++++++++++++++++++++++++++++++++++++++++++++++++++| 100% elapsed = 02s
Hs_v3_sub1_res1.2_c8over2_4
library(plyr)
Hs_GA2123_Trachea_v3_sub1@meta.data$cell_type<-mapvalues(Hs_GA2123_Trachea_v3_sub1@meta.data$res.1.2,from=c("0","1","2","3","4","5","6","7","8"),to=c("Secretory_SMG","Ciliated","Basal_SE","Epcam_ECM","Basal_SE","Myoepithelial","Ciliated_Foxn4","Secretory_SE","Basal_SMG"))

to annotate Hs_GA2123_Trachea_v3
Hs_v3_type_sub1<-Hs_GA2123_Trachea_v3_sub1@meta.data$cell_type
names(Hs_v3_type_sub1)<-Hs_GA2123_Trachea_v3_sub1@cell.names
Hs_GA2123_Trachea_v3@meta.data$cell_type<-mapvalues(Hs_GA2123_Trachea_v3@meta.data$res.1,from=c("0","1","2","3","4","5","6","7","8","9","10","11","12","13","14","15","16","17","18","19","20","21","22"),to=c("Fibroblast","Fibroblast","Fibroblast","VascularEndothelial","Fibroblast","Fibroblast","CyclingFibroblast","Fibroblast","Chondrocyte","Basal","Schwann/Neural","Fibroblast","Secretory","MesenchymalProgenitor","Stem","Fibroblast","Ciliated","Fibroblast","Chondrocyte","Immune","Muscle","Muscle","LymphaticEndothelial"))
Hs_GA2123_Trachea_v3<-AddMetaData(object = Hs_GA2123_Trachea_v3, metadata = Hs_v3_type_sub1, col.name = "specific_type")
table(Hs_GA2123_Trachea_v3@meta.data$specific_type)
Basal_SE Basal_SMG Ciliated Ciliated_Foxn4 Epcam_ECM Myoepithelial Secretory_SE Secretory_SMG
308 30 169 66 150 67 54 176
Hs_GA2123_Trachea_v3@meta.data$specific_type <- ifelse(is.na(Hs_GA2123_Trachea_v3@meta.data$specific_type), as.character(Hs_GA2123_Trachea_v3@meta.data$cell_type), as.character(Hs_GA2123_Trachea_v3@meta.data$specific_type))
now we have annotation for all cells:
table(Hs_GA2123_Trachea_v3@meta.data$specific_type)
Basal_SE Basal_SMG Chondrocyte Ciliated Ciliated_Foxn4 CyclingFibroblast
308 30 650 169 66 479
Epcam_ECM Fibroblast Immune LymphaticEndothelial MesenchymalProgenitor Muscle
150 5359 121 65 316 177
Myoepithelial Schwann/Neural Secretory_SE Secretory_SMG Stem VascularEndothelial
67 405 54 176 286 815

print(levels(Hs_GA2123_Trachea_v3@ident))
[1] "Basal_SE" "Basal_SMG" "Chondrocyte" "Ciliated" "Ciliated_Foxn4"
[6] "CyclingFibroblast" "Epcam_ECM" "Fibroblast" "Immune" "LymphaticEndothelial"
[11] "MesenchymalProgenitor" "Muscle" "Myoepithelial" "Schwann/Neural" "Secretory_SE"
[16] "Secretory_SMG" "Stem" "VascularEndothelial"
Hs_GA2123_Trachea_v3<-SetAllIdent(object = Hs_GA2123_Trachea_v3, id = "specific_type")
Hs_GA2123_Trachea_v3@ident = factor(Hs_GA2123_Trachea_v3@ident,levels(Hs_GA2123_Trachea_v3@ident)[c(1,15,5,4,2,16,13,7,17,14,9,10,18,12,3,11,8,6)])

DotPlot(object = Hs_GA2123_Trachea_v3, cols.use = c("forestgreen","magenta3"),genes.plot = c("CFTR","ANO1","EPCAM","TP63","KRT5","FOXN4","SHISA8","MCIDAS","SNTN","CDHR3","FOXJ1","MUC16","SERPINB3","SOX9","KRT14","SOSTDC1","MUC5B","MUC5AC","SPDEF","LTF","LYZ","ACTA2","POU5F1","ESRG","SNAP25","CHGA","PLP1","MPZ","FCER1G","C1QA","PECAM1","LYVE1","MYH11","RGS5","NOTCH3","COL2A1","ACAN","WNT2","PI16","CD34","THY1","TWIST2","MKI67"),group.by = "ident", x.lab.rot = T,plot.legend = T,col.min = -2,col.max = 2)


df_Hs<-FetchData(Hs_GA2123_Trachea_v3,c("ANO1","CFTR","SERPINB3","MUC16","specific_type"))



For the purpose of visualization, we average within each specific cell type:
Hs_GA2123_Trachea_v3<-SetAllIdent(object = Hs_GA2123_Trachea_v3, id = "specific_type")
average_Hs_specific_Annotation<-AverageExpression(object = Hs_GA2123_Trachea_v3,return.seurat = T)
Finished averaging RNA for cluster Basal_SE
Finished averaging RNA for cluster Basal_SMG
Finished averaging RNA for cluster Chondrocyte
Finished averaging RNA for cluster Ciliated
Finished averaging RNA for cluster Ciliated_Foxn4
Finished averaging RNA for cluster CyclingFibroblast
Finished averaging RNA for cluster Epcam_ECM
Finished averaging RNA for cluster Fibroblast
Finished averaging RNA for cluster Immune
Finished averaging RNA for cluster LymphaticEndothelial
Finished averaging RNA for cluster MesenchymalProgenitor
Finished averaging RNA for cluster Muscle
Finished averaging RNA for cluster Myoepithelial
Finished averaging RNA for cluster Schwann/Neural
Finished averaging RNA for cluster Secretory_SE
Finished averaging RNA for cluster Secretory_SMG
Finished averaging RNA for cluster Stem
Finished averaging RNA for cluster VascularEndothelial
Performing log-normalization
0% 10 20 30 40 50 60 70 80 90 100%
[----|----|----|----|----|----|----|----|----|----|
**************************************************|
Scaling data matrix
|
| | 0%
|
|===============================================================================================================| 100%

save(Hs_GA2123_Trachea_v3_sub1,file="seurat_GA2123wk_v3_sub1.RData")
save(Hs_GA2123_Trachea_v3,file="seurat_GA2123wk_v3.RData")
load(file="seurat_GA2123wk_v3.RData")
LS0tCnRpdGxlOiAiSHNfQXByMyIKb3V0cHV0OiBodG1sX25vdGVib29rCi0tLQojIyMjIEh1bWFuIGZldGFsIHRyYWNoZWEgc2FtcGxlcyBjb2xsZWN0ZWQgb24gQXByMy4gdjMgY2hlbWlzdHJ5LgpgYGB7cn0KbGlicmFyeShTZXVyYXQpCmxpYnJhcnkoZHBseXIpCmBgYApgYGB7cn0KWmlwRjwtbGlzdC5maWxlcyhwYXRoPSIuIixwYXR0ZXJuPSIqLmd6IixmdWxsLm5hbWVzID0gVCxyZWN1cnNpdmUgPSBUKQpaaXBGCmBgYApgYGB7cn0KbGlicmFyeShwbHlyKQpsaWJyYXJ5KFIudXRpbHMpCmxkcGx5KC5kYXRhPVppcEYsIC5mdW49Z3VuemlwKSAgI1RoaXMganVzdCB1bnppcHMgbG9jYWxseQpgYGAKCmBgYHtyfQojIyMjIyBGaXJzdCBJIG1hbnVhbGx5IGNoYW5nZWQgYWxsIGZlYXR1cnJlcy50c3YgdG8gZ2VuZXMudHN2LiBPdGhlcndpc2UgUmVhZDEwWCAoU2V1cmF0IHYyKSB3b3VsZCBub3QgcmVjb2duaXplLgojIExvYWQgZGF0YQpmaWxlXzEwWGRpcl9IczwtYygiR0EyMXdrX3YzIiwiR0EyM3drX3YzIikKbmFtZXMoZmlsZV8xMFhkaXJfSHMpPC1jKCJHQTIxd2tfdjMiLCJHQTIzd2tfdjMiKQpIc19BcHIzX3YzLmRhdGEgPC0gUmVhZDEwWChkYXRhLmRpciA9IGZpbGVfMTBYZGlyX0hzKQpgYGAKCmBgYHtyfQpkaW0oSHNfQXByM192My5kYXRhKQpgYGAKIyMjIyMgMjY1NzcgZ2VuZXMgZm9yIEhHMzgtcGx1cwojIyMjIyAzODg5MiAiY2VsbHMiL2JhcmNvZGVzIGFzIGZpbHRlcmVkIGJ5IENlbGwgUmFuZ2VyCgpgYGB7cn0KSHNfR0EyMTIzX1RyYWNoZWFfdjMgPC0gQ3JlYXRlU2V1cmF0T2JqZWN0KHJhdy5kYXRhID0gSHNfQXByM192My5kYXRhLCBtaW4uY2VsbHMgPSAxLCBtaW4uZ2VuZXMgPSAxLCAKICAgIHByb2plY3QgPSAiSHNfR0EyMTIzX1RyYWNoZWFfdjNjaGVtaXN0cnkiKQpIc19HQTIxMjNfVHJhY2hlYV92M0ByYXcuZGF0YUBEaW0KYGBgCmBgYHtyfQpoZWFkKEhzX0dBMjEyM19UcmFjaGVhX3YzQGNlbGwubmFtZXMpCmBgYAoKYGBge3J9CkhzX0dBMjEyM19UcmFjaGVhX3YzIDwtIEZpbHRlckNlbGxzKG9iamVjdCA9IEhzX0dBMjEyM19UcmFjaGVhX3YzLCBzdWJzZXQubmFtZXMgPSBjKCJuR2VuZSIsIm5VTUkiKSwgCiAgICBsb3cudGhyZXNob2xkcyA9IGMoMTAwMCw0MDAwKSwgaGlnaC50aHJlc2hvbGRzID0gYyhJbmYsSW5mKSkKSHNfR0EyMTIzX1RyYWNoZWFfdjNAZGF0YUBEaW0KYGBgCgpgYGB7cn0KY2VsbF9uYW1lPC1yZWFkLnRhYmxlKHRleHQ9SHNfR0EyMTIzX1RyYWNoZWFfdjNAY2VsbC5uYW1lcyxzZXA9Il8iLGNvbENsYXNzZXMgPSAiY2hhcmFjdGVyIikKYWdlPC1jZWxsX25hbWVbLDFdCm5hbWVzKGFnZSk8LUhzX0dBMjEyM19UcmFjaGVhX3YzQGNlbGwubmFtZXMKYGBgCmBgYHtyfQpIc19HQTIxMjNfVHJhY2hlYV92MzwtQWRkTWV0YURhdGEob2JqZWN0ID0gSHNfR0EyMTIzX1RyYWNoZWFfdjMsIG1ldGFkYXRhID0gYWdlLCBjb2wubmFtZSA9ICJhZ2UiKQpgYGAKCmBgYHtyfQp0YWJsZShIc19HQTIxMjNfVHJhY2hlYV92M0BtZXRhLmRhdGEkYWdlKQpgYGAKCmBgYHtyfQpyaWJvLmdlbmVzIDwtIGdyZXAocGF0dGVybiA9ICJeUlBbU0xdW1s6ZGlnaXQ6XV0iLCB4ID0gcm93bmFtZXMoeCA9IEhzX0dBMjEyM19UcmFjaGVhX3YzQGRhdGEpLCB2YWx1ZSA9IFRSVUUpCnBlcmNlbnQucmlibyA8LSBNYXRyaXg6OmNvbFN1bXMoSHNfR0EyMTIzX1RyYWNoZWFfdjNAcmF3LmRhdGFbcmliby5nZW5lcywgXSkvTWF0cml4Ojpjb2xTdW1zKEhzX0dBMjEyM19UcmFjaGVhX3YzQHJhdy5kYXRhKQpIc19HQTIxMjNfVHJhY2hlYV92MyA8LSBBZGRNZXRhRGF0YShvYmplY3QgPSBIc19HQTIxMjNfVHJhY2hlYV92MywgbWV0YWRhdGEgPSBwZXJjZW50LnJpYm8sIGNvbC5uYW1lID0gInBlcmNlbnQucmlibyIpCmBgYAoKYGBge3J9CmFnZ3JlZ2F0ZShIc19HQTIxMjNfVHJhY2hlYV92M0BtZXRhLmRhdGFbLCBjKDE6Miw1KV0sIGxpc3QoSHNfR0EyMTIzX1RyYWNoZWFfdjNAbWV0YS5kYXRhJGFnZSksIG1lZGlhbikKCmBgYAoKYGBge3J9CkhzX0dBMjEyM19UcmFjaGVhX3YzIDwtIE5vcm1hbGl6ZURhdGEob2JqZWN0ID0gSHNfR0EyMTIzX1RyYWNoZWFfdjMpCmBgYAoKYGBge3J9CkhzX0dBMjEyM19UcmFjaGVhX3YzIDwtIFNjYWxlRGF0YShvYmplY3QgPSBIc19HQTIxMjNfVHJhY2hlYV92MykKYGBgCgpgYGB7cn0KSHNfR0EyMTIzX1RyYWNoZWFfdjMgPC0gRmluZFZhcmlhYmxlR2VuZXMob2JqZWN0ID0gSHNfR0EyMTIzX1RyYWNoZWFfdjMsIGRvLnBsb3QgPSBUUlVFLCB4Lmxvdy5jdXRvZmY9MC4xLHguaGlnaC5jdXRvZmYgPSBJbmYsIHkuY3V0b2ZmID0gMC41KQpgYGAKCmBgYHtyfQpIc19HQTIxMjNfVHJhY2hlYV92MyA8LSBSdW5QQ0Eob2JqZWN0ID0gSHNfR0EyMTIzX1RyYWNoZWFfdjMsIGRvLnByaW50ID0gRkFMU0UpCkhzX0dBMjEyM19UcmFjaGVhX3YzIDwtIFByb2plY3RQQ0Eob2JqZWN0ID0gSHNfR0EyMTIzX1RyYWNoZWFfdjMsIGRvLnByaW50ID0gRkFMU0UpCmBgYApgYGB7cixmaWcuaGVpZ2h0PTUwLGZpZy53aWR0aD0xNX0KUENIZWF0bWFwKG9iamVjdCA9IEhzX0dBMjEyM19UcmFjaGVhX3YzLCBwYy51c2UgPSAxOjEwLCBjZWxscy51c2UgPSA1MDAsIGRvLmJhbGFuY2VkID0gVFJVRSwgbGFiZWwuY29sdW1ucyA9IEZBTFNFLCBudW0uZ2VuZXMgPSAyNSkKCmBgYAoKYGBge3J9ClBDRWxib3dQbG90KG9iamVjdCA9IEhzX0dBMjEyM19UcmFjaGVhX3YzKQpgYGAKCmBgYHtyfQpuLnBjcyA9IDIwCnJlcy51c2VkIDwtIDAuOAoKSHNfR0EyMTIzX1RyYWNoZWFfdjMgPC0gRmluZENsdXN0ZXJzKG9iamVjdCA9IEhzX0dBMjEyM19UcmFjaGVhX3YzLCByZWR1Y3Rpb24udHlwZSA9ICJwY2EiLCBkaW1zLnVzZSA9IDE6bi5wY3MsIAogICAgcmVzb2x1dGlvbiA9IHJlcy51c2VkLCBwcmludC5vdXRwdXQgPSAwLCBzYXZlLlNOTiA9IFRSVUUpCmBgYApgYGB7cn0KSHNfR0EyMTIzX1RyYWNoZWFfdjMgPC0gUnVuVFNORShvYmplY3QgPSBIc19HQTIxMjNfVHJhY2hlYV92MywgZGltcy51c2UgPSAxOm4ucGNzLCBzZWVkLnVzZSA9IDEwLCBwZXJwbGV4aXR5PTMwLCBkaW0uZW1iZWQgPSAyKQoKYGBgCgpgYGB7cn0KVFNORVBsb3Qob2JqZWN0ID0gSHNfR0EyMTIzX1RyYWNoZWFfdjMsIGRvLmxhYmVsID0gVCxncm91cC5ieT0icmVzLjAuOCIscHQuc2l6ZSA9IDAuMikKCmBgYAoKYGBge3J9ClRTTkVQbG90KG9iamVjdCA9IEhzX0dBMjEyM19UcmFjaGVhX3YzLCBkby5sYWJlbCA9IEYsZ3JvdXAuYnk9ImFnZSIscHQuc2l6ZSA9IDAuMSkKYGBgCgpgYGB7cn0Kbi5wY3MgPSAyMApyZXMudXNlZCA8LSAxLjAKCkhzX0dBMjEyM19UcmFjaGVhX3YzIDwtIEZpbmRDbHVzdGVycyhvYmplY3QgPSBIc19HQTIxMjNfVHJhY2hlYV92MywgcmVkdWN0aW9uLnR5cGUgPSAicGNhIiwgZGltcy51c2UgPSAxOm4ucGNzLCAKICAgIHJlc29sdXRpb24gPSByZXMudXNlZCwgcHJpbnQub3V0cHV0ID0gMCwgc2F2ZS5TTk4gPSBUUlVFLGZvcmNlLnJlY2FsYz1UKQpgYGAKYGBge3J9CkhzX0dBMjEyM19UcmFjaGVhX3YzIDwtIFJ1blRTTkUob2JqZWN0ID0gSHNfR0EyMTIzX1RyYWNoZWFfdjMsIGRpbXMudXNlID0gMTpuLnBjcywgc2VlZC51c2UgPSAxMCwgcGVycGxleGl0eT0zMCwgZGltLmVtYmVkID0gMixrLnBhcmFtPTEwKQoKYGBgCgpgYGB7cn0KVFNORVBsb3Qob2JqZWN0ID0gSHNfR0EyMTIzX1RyYWNoZWFfdjMsIGRvLmxhYmVsID0gVCxncm91cC5ieT0icmVzLjEiKQoKYGBgCgpgYGB7cixmaWcuaGVpZ2h0PTE1LGZpZy53aWR0aD02MH0KRG9IZWF0bWFwKG9iamVjdCA9IEhzX0dBMjEyM19UcmFjaGVhX3YzLCBnZW5lcy51c2UgPSBjKCJBTk8xIiwiQ0ZUUiIsIkVQQ0FNIiwiVFA2MyIsIkZPWEoxIiwiRk9YTjQiLCJTQ0dCMUExIiwiTFRGIiwiU05BUDI1IiwiQVNDTDEiLCJDSEdBIiwiUExQMSIsIk1QWiIsIlNPWDEwIiwiQzFRQSIsIkZDRVIxRyIsIlBFQ0FNMSIsIkxZVkUxIiwiUkdTNSIsIk5PVENIMyIsIkFDVEEyIiwiQUNURzIiLCJERVMiLCJQRExJTTMiLCJGR0wyIiwiUENESDciLCJNWUgxMSIsIkNPTDExQTEiLCJTT1g5IiwiU09YNSIsIlNPWDYiLCJDT0wyQTEiLCJBQ0FOIiwiU0VSUElORjEiLCJDT0wxQTEiLCJUSEJTMiIsIktFUkEiLCJEQ04iLCJMVU0iLCJDRDM0IiwiV05UMiIsIlRIWTEiLCJQSTE2IiwiQ0xFQzNCIiwiTUtJNjciLCJUT1AyQSIsIlRXSVNUMiIpLCAKICAgIHNsaW0uY29sLmxhYmVsID0gVFJVRSwgZ3JvdXAubGFiZWwucm90ID0gVFJVRSx1c2Uuc2NhbGVkID0gVCxncm91cC5ieT0icmVzLjEiLGdyb3VwLmNleCA9IDI1LGNleC5yb3c9MjUsZ3JvdXAub3JkZXIgPSBjKDksMTYsMTIsMTQsMTAsMTksMywyMiwyMCwyMSw1LDcsMTUsMTcsOCwxOCw0LDAsMiwxLDEzLDExLDYpCiAgKQpgYGAKCmBgYHtyfQpIc19HQTIxMjNfVHJhY2hlYV92MzwtU2V0QWxsSWRlbnQoSHNfR0EyMTIzX1RyYWNoZWFfdjMsaWQ9InJlcy4xIikKR0EyMTIzd2tfdjMucmVzMS5jbHVzdC5tYXJrZXJzIDwtIEZpbmRBbGxNYXJrZXJzKG9iamVjdCA9IEhzX0dBMjEyM19UcmFjaGVhX3YzLCBvbmx5LnBvcyA9IFRSVUUsIG1pbi5wY3QgPSAwLjI1LCB0aHJlc2gudXNlID0gMC4yNSkKCmBgYAoKYGBge3J9CkdBMjEyM3drX3YzLnJlczEuY2x1c3QubWFya2VycyAlPiUgZ3JvdXBfYnkoY2x1c3RlcikgJT4lIHRvcF9uKDIwLCBhdmdfbG9nRkMpCmBgYApgYGB7cn0Kd3JpdGUudGFibGUoR0EyMTIzd2tfdjMucmVzMS5jbHVzdC5tYXJrZXJzLCJHQTIxMjN3a192My5yZXMxLm1hcmtlcnMudHh0IixzZXA9Ilx0IikKCmBgYApgYGB7cn0KSHNfdjNfcmVzMV84XzE4PC1GaW5kTWFya2VycyhIc19HQTIxMjNfVHJhY2hlYV92MyxpZGVudC4xPWMoOCksaWRlbnQuMj1jKDE4KSxvbmx5LnBvcyA9IEYpCkhzX3YzX3JlczFfOF8xOApgYGAKCmBgYHtyfQpIc192M19yZXMxXzJvdmVyMTwtRmluZE1hcmtlcnMoSHNfR0EyMTIzX1RyYWNoZWFfdjMsaWRlbnQuMT1jKDIpLGlkZW50LjI9YygxKSxvbmx5LnBvcyA9IFQpCkhzX3YzX3JlczFfMm92ZXIxCmBgYAoKYGBge3J9CkhzX3YzX3JlczFfMjFfMjA8LUZpbmRNYXJrZXJzKEhzX0dBMjEyM19UcmFjaGVhX3YzLGlkZW50LjE9YygyMSksaWRlbnQuMj1jKDIwKSxvbmx5LnBvcyA9IFQpCkhzX3YzX3JlczFfMjFfMjAKYGBgCgpgYGB7cn0Kbi5wY3MgPSAyMApyZXMudXNlZCA8LSAxLjIKCkhzX0dBMjEyM19UcmFjaGVhX3YzIDwtIEZpbmRDbHVzdGVycyhvYmplY3QgPSBIc19HQTIxMjNfVHJhY2hlYV92MywgcmVkdWN0aW9uLnR5cGUgPSAicGNhIiwgZGltcy51c2UgPSAxOm4ucGNzLCAKICAgIHJlc29sdXRpb24gPSByZXMudXNlZCwgcHJpbnQub3V0cHV0ID0gMCwgc2F2ZS5TTk4gPSBUUlVFKQpgYGAKCmBgYHtyfQpIc19HQTIxMjNfVHJhY2hlYV92MyA8LSBSdW5UU05FKG9iamVjdCA9IEhzX0dBMjEyM19UcmFjaGVhX3YzLCBkaW1zLnVzZSA9IDE6bi5wY3MsIHNlZWQudXNlID0gMTAsIHBlcnBsZXhpdHk9MzAsIGRpbS5lbWJlZCA9IDIsay5wYXJhbT0xMCkKCmBgYAoKYGBge3J9ClRTTkVQbG90KG9iamVjdCA9IEhzX0dBMjEyM19UcmFjaGVhX3YzLCBkby5sYWJlbCA9IFQsZ3JvdXAuYnk9InJlcy4xLjIiKQoKYGBgCgpgYGB7cn0Kbi5wY3MgPSAyMApyZXMudXNlZCA8LSAxLjQKCkhzX0dBMjEyM19UcmFjaGVhX3YzIDwtIEZpbmRDbHVzdGVycyhvYmplY3QgPSBIc19HQTIxMjNfVHJhY2hlYV92MywgcmVkdWN0aW9uLnR5cGUgPSAicGNhIiwgZGltcy51c2UgPSAxOm4ucGNzLCAKICAgIHJlc29sdXRpb24gPSByZXMudXNlZCwgcHJpbnQub3V0cHV0ID0gMCwgc2F2ZS5TTk4gPSBUUlVFKQpgYGAKCmBgYHtyfQpIc19HQTIxMjNfVHJhY2hlYV92MyA8LSBSdW5UU05FKG9iamVjdCA9IEhzX0dBMjEyM19UcmFjaGVhX3YzLCBkaW1zLnVzZSA9IDE6bi5wY3MsIHNlZWQudXNlID0gMTAsIHBlcnBsZXhpdHk9MzAsIGRpbS5lbWJlZCA9IDIsay5wYXJhbT0xMCkKCmBgYAoKYGBge3J9ClRTTkVQbG90KG9iamVjdCA9IEhzX0dBMjEyM19UcmFjaGVhX3YzLCBkby5sYWJlbCA9IFQsZ3JvdXAuYnk9InJlcy4xLjQiKQoKYGBgCgpgYGB7cn0KbG9hZCgiR0EyMTIzd2tfYXByM192M19kb3VibGV0U2NvcmUuUkRhdGEiKQpIc19HQTIxMjNfVHJhY2hlYV92MzwtQWRkTWV0YURhdGEob2JqZWN0ID0gSHNfR0EyMTIzX1RyYWNoZWFfdjMsIG1ldGFkYXRhID0gR0EyMTIzd2tfYXByM192M19kb3VibGV0U2NvcmUsIGNvbC5uYW1lID0gImRvdWJsZXRfc2NvcmUiKQpzdW0oaXMubmEoSHNfR0EyMTIzX1RyYWNoZWFfdjNAbWV0YS5kYXRhJGRvdWJsZXRfc2NvcmUpKQpgYGAKCgpgYGB7cixmaWcuaGVpZ2h0PTUsIGZpZy53aWR0aD0yMH0KSHNfR0EyMTIzX1RyYWNoZWFfdjM8LVNldEFsbElkZW50KEhzX0dBMjEyM19UcmFjaGVhX3YzLGlkPSJhZ2UiKQpWbG5QbG90KG9iamVjdCA9IEhzX0dBMjEyM19UcmFjaGVhX3YzLCBmZWF0dXJlcy5wbG90ID0gYygiZG91YmxldF9zY29yZSIpLCBuQ29sID0gMSxncm91cC5ieT0icmVzLjEuNCIscG9pbnQuc2l6ZS51c2U9MC4zLGlkZW50LmluY2x1ZGUgPSAiR0EyMXdrIikKYGBgCgpgYGB7cixmaWcuaGVpZ2h0PTUsIGZpZy53aWR0aD0yMH0KVmxuUGxvdChvYmplY3QgPSBIc19HQTIxMjNfVHJhY2hlYV92MywgZmVhdHVyZXMucGxvdCA9IGMoImRvdWJsZXRfc2NvcmUiKSwgbkNvbCA9IDEsZ3JvdXAuYnk9InJlcy4xLjQiLHBvaW50LnNpemUudXNlPTAuMyxpZGVudC5pbmNsdWRlID0gIkdBMjN3ayIpCmBgYAoKYGBge3IsZmlnLmhlaWdodD0yMCxmaWcud2lkdGg9NjB9CkRvSGVhdG1hcChvYmplY3QgPSBIc19HQTIxMjNfVHJhY2hlYV92MywgZ2VuZXMudXNlID0gYygiQU5PMSIsIkNGVFIiLCJFUENBTSIsIktSVDgiLCJLUlQxOCIsIlRQNjMiLCJLUlQ1IiwiS1JUMTQiLCJTT1NUREMxIiwiS1JUNCIsIktSVDEzIiwiU1BERUYiLCJDUkVCM0wxIiwiTVVDNUIiLCJGT1hKMSIsIkZPWE40IiwiU0hJU0E4IiwiTUNJREFTIiwiVFVCQjMiLCJTTkFQMjUiLCJBU0NMMSIsIkNIR0EiLCJQTFAxIiwiTVBaIiwiQzFRQSIsIkZDRVIxRyIsIkNEM0ciLCJQRUNBTTEiLCJOUlAxIiwiTFlWRTEiLCJSR1M1IiwiTk9UQ0gzIiwiQUNUQTIiLCJUQUdMTiIsIk1ZSDExIiwiQ09MOEExIiwiQ09MMTFBMSIsIlNPWDkiLCJDT0wyQTEiLCJBQ0FOIiwiTUlBIiwiRENOIiwiTFVNIiwiQ0QzNCIsIldOVDIiLCJUSFkxIiwiUEkxNiIsIkNMRUMzQiIsIlRLMSIsIk1LSTY3IiwiVE9QMkEiLCJBTEFTMiIpLCAKICAgIHNsaW0uY29sLmxhYmVsID0gVFJVRSwgZ3JvdXAubGFiZWwucm90ID0gVFJVRSx1c2Uuc2NhbGVkID0gVCxncm91cC5ieT0icmVzLjEuNCIsZ3JvdXAuY2V4ID0gMzUsY2V4LnJvdz0yNSxncm91cC5vcmRlciA9IGMoOCwxNCwxNywxOSwxMCwyMSw5LDExLDI0LDIyLDIzLDMsNSwxNiwxOCw2LDIwLDEzLDcsMCwxLDIsMTUsMTIsNCkKICApCmBgYAoKCmBgYHtyLGZpZy5oZWlnaHQ9MTUsIGZpZy53aWR0aD0yMH0KVmxuUGxvdChvYmplY3QgPSBIc19HQTIxMjNfVHJhY2hlYV92MywgZmVhdHVyZXMucGxvdCA9IGMoIlNPWDEwIiwiUEhPWDJBIiwgIlBIT1gyQiIsIkNIR0EiLCJBU0NMMSIsIlJFVCIpLCBuQ29sID0gMSxncm91cC5ieT0icmVzLjEuNCIscG9pbnQuc2l6ZS51c2U9MC4zKQpgYGAKYGBge3IsZmlnLmhlaWdodD04LGZpZy53aWR0aD00MH0KICAgIERvSGVhdG1hcChvYmplY3QgPSBIc19HQTIxMjNfVHJhY2hlYV92MywgZ2VuZXMudXNlID0gYygiRVBDQU0iLCJUVUJCMyIsIlNOQVAyNSIsIkFTQ0wxIiwiQ0hHQSIsIlBIT1gyQSIsIlBIT1gyQiIsIlBMUDEiLCJNUFoiKSwgCiAgICBzbGltLmNvbC5sYWJlbCA9IFRSVUUsIGdyb3VwLmxhYmVsLnJvdCA9IFRSVUUsdXNlLnNjYWxlZCA9IFQsZ3JvdXAuYnk9InJlcy4xLjQiLGdyb3VwLmNleCA9IDM1LGNleC5yb3c9MjUsY2VsbHMudXNlID0gSHNfR0EyMTIzX1RyYWNoZWFfdjNAY2VsbC5uYW1lc1tIc19HQTIxMjNfVHJhY2hlYV92M0BtZXRhLmRhdGEkcmVzLjEuNCAlaW4lIGMoMTApXQogICkKYGBgCgojIyMjIyBzdWJzZXQgdGhlIE5vbi1FUENBTSBjZWxsczoKYGBge3J9CkhzX0dBMjEyM19UcmFjaGVhX3YzIDwtIFNldEFsbElkZW50KG9iamVjdCA9IEhzX0dBMjEyM19UcmFjaGVhX3YzLCBpZCA9ICJyZXMuMS40IikKSHNfR0EyMTIzX1RyYWNoZWFfdjNfbm9uRXBjYW08LVN1YnNldERhdGEob2JqZWN0PUhzX0dBMjEyM19UcmFjaGVhX3YzLGlkZW50LnVzZT1jKDA6Nyw5OjEzLDE1LDE2LDE4LDIwOjI0KSkKdGFibGUoSHNfR0EyMTIzX1RyYWNoZWFfdjNfbm9uRXBjYW1AbWV0YS5kYXRhJHJlcy4xLjQpCmBgYAoKYGBge3J9CmNvbG5hbWVzKEhzX0dBMjEyM19UcmFjaGVhX3YzX25vbkVwY2FtQG1ldGEuZGF0YSlbY29sbmFtZXMoSHNfR0EyMTIzX1RyYWNoZWFfdjNfbm9uRXBjYW1AbWV0YS5kYXRhKSA9PSAncmVzLjAuOCddIDwtICdvcmlnLjAuOCcKY29sbmFtZXMoSHNfR0EyMTIzX1RyYWNoZWFfdjNfbm9uRXBjYW1AbWV0YS5kYXRhKVtjb2xuYW1lcyhIc19HQTIxMjNfVHJhY2hlYV92M19ub25FcGNhbUBtZXRhLmRhdGEpID09ICdyZXMuMS40J10gPC0gJ29yaWcuMS40Jwpjb2xuYW1lcyhIc19HQTIxMjNfVHJhY2hlYV92M19ub25FcGNhbUBtZXRhLmRhdGEpW2NvbG5hbWVzKEhzX0dBMjEyM19UcmFjaGVhX3YzX25vbkVwY2FtQG1ldGEuZGF0YSkgPT0gJ3Jlcy4xLjInXSA8LSAnb3JpZy4xLjInCmBgYAoKYGBge3J9CkhzX0dBMjEyM19UcmFjaGVhX3YzX25vbkVwY2FtIDwtIFNjYWxlRGF0YShvYmplY3QgPSBIc19HQTIxMjNfVHJhY2hlYV92M19ub25FcGNhbSkKYGBgCgpgYGB7cn0KSHNfR0EyMTIzX1RyYWNoZWFfdjNfbm9uRXBjYW0gPC0gRmluZFZhcmlhYmxlR2VuZXMob2JqZWN0ID0gSHNfR0EyMTIzX1RyYWNoZWFfdjNfbm9uRXBjYW0sIGRvLnBsb3QgPSBUUlVFLCB4Lmxvdy5jdXRvZmY9MC4xLHguaGlnaC5jdXRvZmYgPSBJbmYsIHkuY3V0b2ZmID0gMC41KQpgYGAKCiMjIyMjI3J1biBQQ0Egb24gdGhlIHNldCBvZiBnZW5lcwpgYGB7cn0KSHNfR0EyMTIzX1RyYWNoZWFfdjNfbm9uRXBjYW0gPC0gUnVuUENBKG9iamVjdCA9IEhzX0dBMjEyM19UcmFjaGVhX3YzX25vbkVwY2FtLCBkby5wcmludCA9IEZBTFNFKQojUENBUGxvdChIc19HQTIxMjNfVHJhY2hlYV92M19ub25FcGNhbSkKYGBgCgpgYGB7cn0KSHNfR0EyMTIzX1RyYWNoZWFfdjNfbm9uRXBjYW0gPC0gUHJvamVjdFBDQShvYmplY3QgPSBIc19HQTIxMjNfVHJhY2hlYV92M19ub25FcGNhbSwgZG8ucHJpbnQgPSBGKQpgYGAKCmBgYHtyfQpQQ0VsYm93UGxvdChvYmplY3QgPSBIc19HQTIxMjNfVHJhY2hlYV92M19ub25FcGNhbSkKYGBgCmBgYHtyLGZpZy5oZWlnaHQ9MzAsZmlnLndpZHRoPTE1fQpQQ0hlYXRtYXAob2JqZWN0ID0gSHNfR0EyMTIzX1RyYWNoZWFfdjNfbm9uRXBjYW0sIHBjLnVzZSA9IDE6MjAsIGNlbGxzLnVzZSA9IDUwMCwgZG8uYmFsYW5jZWQgPSBUUlVFLCBsYWJlbC5jb2x1bW5zID0gRkFMU0UsIG51bS5nZW5lcyA9IDI1KQoKYGBgCgpgYGB7cn0Kbi5wY3MgPSAyMApyZXMudXNlZCA8LSAwLjgKCkhzX0dBMjEyM19UcmFjaGVhX3YzX25vbkVwY2FtIDwtIEZpbmRDbHVzdGVycyhvYmplY3QgPSBIc19HQTIxMjNfVHJhY2hlYV92M19ub25FcGNhbSwgcmVkdWN0aW9uLnR5cGUgPSAicGNhIiwgZGltcy51c2UgPSAxOm4ucGNzLCAKICAgIHJlc29sdXRpb24gPSByZXMudXNlZCwgcHJpbnQub3V0cHV0ID0gMCwgc2F2ZS5TTk4gPSBUUlVFLGZvcmNlLnJlY2FsYyA9IFQpCmBgYAoKYGBge3J9CkhzX0dBMjEyM19UcmFjaGVhX3YzX25vbkVwY2FtIDwtIFJ1blRTTkUob2JqZWN0ID0gSHNfR0EyMTIzX1RyYWNoZWFfdjNfbm9uRXBjYW0sIGRpbXMudXNlID0gMTpuLnBjcywgc2VlZC51c2UgPSAxMCwgcGVycGxleGl0eT0zMCwgZGltLmVtYmVkID0gMixrLnBhcmFtPTEwKQoKYGBgCgpgYGB7cn0KVFNORVBsb3Qob2JqZWN0ID0gSHNfR0EyMTIzX1RyYWNoZWFfdjNfbm9uRXBjYW0sIGRvLmxhYmVsID0gVCxncm91cC5ieT0icmVzLjAuOCIpCgpgYGAKCmBgYHtyLGZpZy5oZWlnaHQ9MjAsZmlnLndpZHRoPTYwfQpEb0hlYXRtYXAob2JqZWN0ID0gSHNfR0EyMTIzX1RyYWNoZWFfdjNfbm9uRXBjYW0sIGdlbmVzLnVzZSA9IGMoIkFOTzEiLCJDRlRSIiwiVFVCQjMiLCJTTkFQMjUiLCJBU0NMMSIsIkNIR0EiLCJQTFAxIiwiTVBaIiwiQzFRQSIsIkZDRVIxRyIsIkNEM0ciLCJQRUNBTTEiLCJOUlAxIiwiTFlWRTEiLCJSR1M1IiwiTk9UQ0gzIiwiQUNUQTIiLCJUQUdMTiIsIk1ZSDExIiwiQ09MOEExIiwiQ09MMTFBMSIsIlNPWDkiLCJDT0wyQTEiLCJBQ0FOIiwiTUlBIiwiRENOIiwiTFVNIiwiQ0QzNCIsIldOVDIiLCJUSFkxIiwiUEkxNiIsIkNMRUMzQiIsIlRLMSIsIk1LSTY3IiwiVE9QMkEiLCJBRElQT1EiLCJDQVIzIiksIAogICAgc2xpbS5jb2wubGFiZWwgPSBUUlVFLCBncm91cC5sYWJlbC5yb3QgPSBUUlVFLHVzZS5zY2FsZWQgPSBULGdyb3VwLmJ5PSJyZXMuMC44Iixncm91cC5jZXggPSAzNSxjZXgucm93PTI1LGdyb3VwLm9yZGVyID0gYyg5LDE0LDIsMTcsMTUsMTYsMTMsNiw4LDUsNCwwLDMsMSwxMCwxMSwxMiw3KQogICkKYGBgCgpgYGB7cn0KdGFibGUoSHNfR0EyMTIzX1RyYWNoZWFfdjNfbm9uRXBjYW1AbWV0YS5kYXRhJG9yaWcuMS40LEhzX0dBMjEyM19UcmFjaGVhX3YzX25vbkVwY2FtQG1ldGEuZGF0YSRyZXMuMC44KQpgYGAKCgpgYGB7cn0KbGlicmFyeShnZ2FsbHV2aWFsKQpgYGAKYGBge3IsIGZpZy5oZWlnaHQ9OSwgZmlnLndpZHRoPTZ9CmdncGxvdChkYXRhPUhzX0dBMjEyM19UcmFjaGVhX3YzX25vbkVwY2FtQG1ldGEuZGF0YSxhZXMoYXhpczE9b3JpZy4xLjQsYXhpczI9cmVzLjAuOCkpK2dlb21fYWxsdXZpdW0oYWVzKGZpbGw9cmVzLjAuOCkpK2dlb21fc3RyYXR1bSh3aWR0aCA9IDEvMTIsIGZpbGwgPSAiYmxhY2siLCBjb2xvciA9ICJncmV5IikgK2dlb21fbGFiZWwoc3RhdCA9ICJzdHJhdHVtIiwgbGFiZWwuc3RyYXRhID0gVFJVRSkrc2NhbGVfeF9kaXNjcmV0ZShsaW1pdHMgPSBjKCJvcmlnLjEuNCIsICJyZXMuMC44IiksIGV4cGFuZCA9IGMoLjA1LCAuMDUpKQpgYGAKCiMjIyMjIE5vdyBzdWJzZXQgdGhlIGJhc2FsLCBjaWxpYXRlZCwgYW5kIHNlY3JldG9yeToKYGBge3J9CkhzX0dBMjEyM19UcmFjaGVhX3YzIDwtIFNldEFsbElkZW50KG9iamVjdCA9IEhzX0dBMjEyM19UcmFjaGVhX3YzLCBpZCA9ICJyZXMuMS40IikKSHNfR0EyMTIzX1RyYWNoZWFfdjNfc3ViMTwtU3Vic2V0RGF0YShvYmplY3Q9SHNfR0EyMTIzX1RyYWNoZWFfdjMsaWRlbnQudXNlPWMoOCwxNCwxOSkpCnRhYmxlKEhzX0dBMjEyM19UcmFjaGVhX3YzX3N1YjFAbWV0YS5kYXRhJHJlcy4xLjQpCmBgYAoKYGBge3J9CmNvbG5hbWVzKEhzX0dBMjEyM19UcmFjaGVhX3YzX3N1YjFAbWV0YS5kYXRhKVtjb2xuYW1lcyhIc19HQTIxMjNfVHJhY2hlYV92M19zdWIxQG1ldGEuZGF0YSkgPT0gJ3Jlcy4wLjgnXSA8LSAnb3JpZy4wLjgnCmNvbG5hbWVzKEhzX0dBMjEyM19UcmFjaGVhX3YzX3N1YjFAbWV0YS5kYXRhKVtjb2xuYW1lcyhIc19HQTIxMjNfVHJhY2hlYV92M19zdWIxQG1ldGEuZGF0YSkgPT0gJ3Jlcy4xLjQnXSA8LSAnb3JpZy4xLjQnCmNvbG5hbWVzKEhzX0dBMjEyM19UcmFjaGVhX3YzX3N1YjFAbWV0YS5kYXRhKVtjb2xuYW1lcyhIc19HQTIxMjNfVHJhY2hlYV92M19zdWIxQG1ldGEuZGF0YSkgPT0gJ3Jlcy4xLjInXSA8LSAnb3JpZy4xLjInCmBgYAoKYGBge3J9CkhzX0dBMjEyM19UcmFjaGVhX3YzX3N1YjEgPC0gU2NhbGVEYXRhKG9iamVjdCA9IEhzX0dBMjEyM19UcmFjaGVhX3YzX3N1YjEpCmBgYAoKYGBge3J9CkhzX0dBMjEyM19UcmFjaGVhX3YzX3N1YjEgPC0gRmluZFZhcmlhYmxlR2VuZXMob2JqZWN0ID0gSHNfR0EyMTIzX1RyYWNoZWFfdjNfc3ViMSwgZG8ucGxvdCA9IFRSVUUsIHgubG93LmN1dG9mZj0wLjEseC5oaWdoLmN1dG9mZiA9IEluZiwgeS5jdXRvZmYgPSAwLjUpCmBgYAoKIyMjIyMjcnVuIFBDQSBvbiB0aGUgc2V0IG9mIGdlbmVzCmBgYHtyfQpIc19HQTIxMjNfVHJhY2hlYV92M19zdWIxIDwtIFJ1blBDQShvYmplY3QgPSBIc19HQTIxMjNfVHJhY2hlYV92M19zdWIxLCBkby5wcmludCA9IEZBTFNFKQojUENBUGxvdChIc19HQTIxMjNfVHJhY2hlYV92M19zdWIxKQpgYGAKCmBgYHtyfQpIc19HQTIxMjNfVHJhY2hlYV92M19zdWIxIDwtIFByb2plY3RQQ0Eob2JqZWN0ID0gSHNfR0EyMTIzX1RyYWNoZWFfdjNfc3ViMSwgZG8ucHJpbnQgPSBGKQpgYGAKCmBgYHtyfQpQQ0VsYm93UGxvdChvYmplY3QgPSBIc19HQTIxMjNfVHJhY2hlYV92M19zdWIxKQpgYGAKYGBge3IsZmlnLmhlaWdodD0zMCxmaWcud2lkdGg9MTV9ClBDSGVhdG1hcChvYmplY3QgPSBIc19HQTIxMjNfVHJhY2hlYV92M19zdWIxLCBwYy51c2UgPSAxOjEyLCBjZWxscy51c2UgPSA1MDAsIGRvLmJhbGFuY2VkID0gVFJVRSwgbGFiZWwuY29sdW1ucyA9IEZBTFNFLCBudW0uZ2VuZXMgPSAyNSkKCmBgYAoKYGBge3J9Cm4ucGNzID0gMTYKcmVzLnVzZWQgPC0gMC44CgpIc19HQTIxMjNfVHJhY2hlYV92M19zdWIxIDwtIEZpbmRDbHVzdGVycyhvYmplY3QgPSBIc19HQTIxMjNfVHJhY2hlYV92M19zdWIxLCByZWR1Y3Rpb24udHlwZSA9ICJwY2EiLCBkaW1zLnVzZSA9IDE6bi5wY3MsIAogICAgcmVzb2x1dGlvbiA9IHJlcy51c2VkLCBwcmludC5vdXRwdXQgPSAwLCBzYXZlLlNOTiA9IFRSVUUpCmBgYApgYGB7cn0KSHNfR0EyMTIzX1RyYWNoZWFfdjNfc3ViMSA8LSBSdW5UU05FKG9iamVjdCA9IEhzX0dBMjEyM19UcmFjaGVhX3YzX3N1YjEsIGRpbXMudXNlID0gMTpuLnBjcywgc2VlZC51c2UgPSAxMCwgcGVycGxleGl0eT0zMCwgZGltLmVtYmVkID0gMixrLnBhcmFtPTEwKQoKYGBgCgpgYGB7cn0KVFNORVBsb3Qob2JqZWN0ID0gSHNfR0EyMTIzX1RyYWNoZWFfdjNfc3ViMSwgZG8ubGFiZWwgPSBUKQoKYGBgCgpgYGB7cixmaWcuaGVpZ2h0PTIwLGZpZy53aWR0aD02MH0KRG9IZWF0bWFwKG9iamVjdCA9IEhzX0dBMjEyM19UcmFjaGVhX3YzX3N1YjEsIGdlbmVzLnVzZSA9IGMoIlRQNjMiLCJLUlQxNSIsIktSVDUiLCJLUlQxNyIsIkZPWE40IiwiU0hJU0E4IiwiTUNJREFTIiwiU05UTiIsIkNESFIzIiwiRk9YSjEiLCJLUlQ0IiwiTVVDMSIsIk1VQzQiLCJNVUMyMCIsIlNFUlBJTkIzIiwiR1NUUDEiLCJBTE9YMTUiLCJDRDkiLCJNWUgxMSIsIkFDVEcyIiwiTVlMSyIsIlRBR0xOIiwiTFRGIiwiQVpHUDEiLCJETUJUMSIsIkZDR0JQIiwiQ0NMMjgiLCJBUVA1IiwiTVVDNUIiLCJTUERFRiIsIlJOQVNFMSIsIkxZWiIsIlRJTVAzIiwiT0dOIiwiQ09MMTRBMSIsIkJHTiIsIkNPTDExQTEiLCJMVU0iLCJBQ0FOIiwiQ0ZUUiIsIkFOTzEiLCJUQUNTVEQyIiksIAogICAgc2xpbS5jb2wubGFiZWwgPSBUUlVFLCBncm91cC5sYWJlbC5yb3QgPSBUUlVFLHVzZS5zY2FsZWQgPSBULGdyb3VwLmJ5PSJyZXMuMC44Iixncm91cC5jZXggPSA2MCxjZXgucm93PTMwLGdyb3VwLm9yZGVyID0gYyg0LDIsNiwxLDcsNSwwLDMpCiAgKQpgYGAKCmBgYHtyLGZpZy5oZWlnaHQ9NCxmaWcud2lkdGg9MTZ9CkRvdFBsb3Qob2JqZWN0ID0gSHNfR0EyMTIzX1RyYWNoZWFfdjNfc3ViMSwgY29scy51c2UgPSBjKCJmb3Jlc3RncmVlbiIsIm1hZ2VudGEzIiksZ2VuZXMucGxvdCA9IGMoIlRQNjMiLCJLUlQxNSIsIktSVDUiLCJLUlQxNyIsIktSVDE0IiwiU09TVERDMSIsIkZPWEoxIiwiRk9YTjQiLCJTSElTQTgiLCJNQ0lEQVMiLCJTTlROIiwiQ0RIUjMiLCJDRkFQNTMiLCJDRVROMiIsIktSVDQiLCJLUlQxMyIsIk1VQzEiLCJNVUM0IiwiTVVDMTYiLCJNVUMyMCIsIlNFUlBJTkIzIiwiTVlIMTEiLCJBQ1RHMiIsIk1ZTEsiLCJBUE9FIiwiVEFHTE4iLCJMVEYiLCJBWkdQMSIsIkRNQlQxIiwiS0NOTjQiLCJGQ0dCUCIsIkxSUkMyNiIsIktSVDciLCJDQ0wyOCIsIkFRUDUiLCJNVUM1QiIsIlNQREVGIiwiTFlaIiwiVElNUDMiLCJPR04iLCJDT0wxNEExIiwiQkdOIiwiTUdQIiwiQ09MMTFBMSIsIkxVTSIsIkFDQU4iLCJDRlRSIiwiQU5PMSIpLGdyb3VwLmJ5ID0gImlkZW50IiwgeC5sYWIucm90ID0gVCxwbG90LmxlZ2VuZCA9IFQpCmBgYAoKYGBge3J9CnByb3AudGFibGUodGFibGUoSHNfR0EyMTIzX1RyYWNoZWFfdjNfc3ViMUBtZXRhLmRhdGEkYWdlLEhzX0dBMjEyM19UcmFjaGVhX3YzX3N1YjFAbWV0YS5kYXRhJHJlcy4wLjgpLDEpCgpgYGAKCmBgYHtyfQpuLnBjcyA9IDE2CnJlcy51c2VkIDwtIDEuMgoKSHNfR0EyMTIzX1RyYWNoZWFfdjNfc3ViMSA8LSBGaW5kQ2x1c3RlcnMob2JqZWN0ID0gSHNfR0EyMTIzX1RyYWNoZWFfdjNfc3ViMSwgcmVkdWN0aW9uLnR5cGUgPSAicGNhIiwgZGltcy51c2UgPSAxOm4ucGNzLCAKICAgIHJlc29sdXRpb24gPSByZXMudXNlZCwgcHJpbnQub3V0cHV0ID0gMCwgc2F2ZS5TTk4gPSBUUlVFKQpgYGAKCmBgYHtyfQpIc19HQTIxMjNfVHJhY2hlYV92M19zdWIxIDwtIFJ1blRTTkUob2JqZWN0ID0gSHNfR0EyMTIzX1RyYWNoZWFfdjNfc3ViMSwgZGltcy51c2UgPSAxOm4ucGNzLCBzZWVkLnVzZSA9IDEwLCBwZXJwbGV4aXR5PTMwLCBkaW0uZW1iZWQgPSAyLGsucGFyYW09MTApCgpgYGAKCmBgYHtyfQpUU05FUGxvdChvYmplY3QgPSBIc19HQTIxMjNfVHJhY2hlYV92M19zdWIxLCBkby5sYWJlbCA9IFQsZ3JvdXAuYnk9InJlcy4xLjIiKQoKYGBgCgpgYGB7cixmaWcuaGVpZ2h0PTIwLGZpZy53aWR0aD02MH0KRG9IZWF0bWFwKG9iamVjdCA9IEhzX0dBMjEyM19UcmFjaGVhX3YzX3N1YjEsIGdlbmVzLnVzZSA9IGMoIlRQNjMiLCJLUlQxNSIsIktSVDUiLCJLUlQxNyIsIktSVDE0IiwiU09TVERDMSIsIlNNT0MyIiwiU09YOSIsIkZPWE40IiwiU0hJU0E4IiwiTUNJREFTIiwiU05UTiIsIkNESFIzIiwiRk9YSjEiLCJLUlQ0IiwiTVVDMSIsIk1VQzQiLCJNVUMyMCIsIlNFUlBJTkIzIiwiR1NUUDEiLCJBTE9YMTUiLCJDRDkiLCJNWUgxMSIsIkFDVEcyIiwiTVlMSyIsIlRBR0xOIiwiTFRGIiwiQVpHUDEiLCJETUJUMSIsIkZDR0JQIiwiQ0NMMjgiLCJBUVA1IiwiTVVDNUIiLCJTUERFRiIsIlJOQVNFMSIsIkxZWiIsIlRJTVAzIiwiT0dOIiwiQ09MMTRBMSIsIkJHTiIsIkNPTDExQTEiLCJMVU0iLCJBQ0FOIiwiQ0ZUUiIsIkFOTzEiLCJUQUNTVEQyIiwiU0VSUElOQjQiLCJTRVJQSU5CMTMiLCJOUFBDIiksIAogICAgc2xpbS5jb2wubGFiZWwgPSBUUlVFLCBncm91cC5sYWJlbC5yb3QgPSBUUlVFLHVzZS5zY2FsZWQgPSBULGdyb3VwLmJ5PSJyZXMuMS4yIixncm91cC5jZXggPSA2MCxjZXgucm93PTMwLGdyb3VwLm9yZGVyID0gYygyLDQsNiwxLDcsOCw1LDAsMykKICApCmBgYAoKYGBge3J9CkhzX3YzX3N1YjFfcmVzMS4yX2M4b3ZlcjJfNDwtRmluZE1hcmtlcnMoSHNfR0EyMTIzX1RyYWNoZWFfdjNfc3ViMSxpZGVudC4xPWMoOCksaWRlbnQuMiA9IGMoMiw0KSxvbmx5LnBvcyA9IFRSVUUpCkhzX3YzX3N1YjFfcmVzMS4yX2M4b3ZlcjJfNApgYGAKCmBgYHtyfQpsaWJyYXJ5KHBseXIpCkhzX0dBMjEyM19UcmFjaGVhX3YzX3N1YjFAbWV0YS5kYXRhJGNlbGxfdHlwZTwtbWFwdmFsdWVzKEhzX0dBMjEyM19UcmFjaGVhX3YzX3N1YjFAbWV0YS5kYXRhJHJlcy4xLjIsZnJvbT1jKCIwIiwiMSIsIjIiLCIzIiwiNCIsIjUiLCI2IiwiNyIsIjgiKSx0bz1jKCJTZWNyZXRvcnlfU01HIiwiQ2lsaWF0ZWQiLCJCYXNhbF9TRSIsIkVwY2FtX0VDTSIsIkJhc2FsX1NFIiwiTXlvZXBpdGhlbGlhbCIsIkNpbGlhdGVkX0ZveG40IiwiU2VjcmV0b3J5X1NFIiwiQmFzYWxfU01HIikpCmBgYAoKYGBge3IsZmlnLmhlaWdodD0zMCxmaWcud2lkdGg9NjB9CkRvSGVhdG1hcChvYmplY3QgPSBIc19HQTIxMjNfVHJhY2hlYV92M19zdWIxLCBnZW5lcy51c2UgPSBjKCJGT1hONCIsIlBMSzQiLCJTSElTQTgiLCJNQ0lEQVMiLCJTTlROIiwiQ0RIUjMiLCJGT1hKMSIsIlRQNjMiLCJLUlQxNSIsIktSVDUiLCJLUlQxNyIsIktSVDE0IiwiU09TVERDMSIsIlNNT0MyIiwiTlBQQyIsIktSVDQiLCJNVUMxIiwiTVVDNCIsIk1VQzIwIiwiU0VSUElOQjMiLCJTRVJQSU5CNCIsIlNFUlBJTkIxMyIsIkdTVFAxIiwiQUxPWDE1IiwiQ0Q5IiwiU09YOSIsIkxURiIsIkFRUDUiLCJMUlJDMjYiLCJBWkdQMSIsIkRNQlQxIiwiRkNHQlAiLCJDQ0wyOCIsIk1VQzVCIiwiU1BERUYiLCJSTkFTRTEiLCJMWVoiLCJNWUgxMSIsIkFDVEcyIiwiTVlMSyIsIlRBR0xOIiwiVElNUDMiLCJPR04iLCJDT0wxNEExIiwiQkdOIiwiQ09MMTFBMSIsIkxVTSIsIkFDQU4iLCJDRlRSIiwiQU5PMSIpLCAKICAgIHNsaW0uY29sLmxhYmVsID0gVFJVRSwgZ3JvdXAubGFiZWwucm90ID0gVFJVRSx1c2Uuc2NhbGVkID0gVCxncm91cC5ieT0iY2VsbF90eXBlIixncm91cC5jZXggPSA2MCxjZXgucm93PTMwLGdyb3VwLm9yZGVyID0gYygiQ2lsaWF0ZWRfRm94bjQiLCJDaWxpYXRlZCIsIkJhc2FsX1NFIiwiU2VjcmV0b3J5X1NFIiwiQmFzYWxfU01HIiwiU2VjcmV0b3J5X1NNRyIsIk15b2VwaXRoZWxpYWwiLCJFcGNhbV9FQ00iKSwKICApCmBgYAoKIyMjIyMgdG8gYW5ub3RhdGUgSHNfR0EyMTIzX1RyYWNoZWFfdjMKYGBge3J9CkhzX3YzX3R5cGVfc3ViMTwtSHNfR0EyMTIzX1RyYWNoZWFfdjNfc3ViMUBtZXRhLmRhdGEkY2VsbF90eXBlCm5hbWVzKEhzX3YzX3R5cGVfc3ViMSk8LUhzX0dBMjEyM19UcmFjaGVhX3YzX3N1YjFAY2VsbC5uYW1lcwpgYGAKCmBgYHtyfQpIc19HQTIxMjNfVHJhY2hlYV92M0BtZXRhLmRhdGEkY2VsbF90eXBlPC1tYXB2YWx1ZXMoSHNfR0EyMTIzX1RyYWNoZWFfdjNAbWV0YS5kYXRhJHJlcy4xLGZyb209YygiMCIsIjEiLCIyIiwiMyIsIjQiLCI1IiwiNiIsIjciLCI4IiwiOSIsIjEwIiwiMTEiLCIxMiIsIjEzIiwiMTQiLCIxNSIsIjE2IiwiMTciLCIxOCIsIjE5IiwiMjAiLCIyMSIsIjIyIiksdG89YygiRmlicm9ibGFzdCIsIkZpYnJvYmxhc3QiLCJGaWJyb2JsYXN0IiwiVmFzY3VsYXJFbmRvdGhlbGlhbCIsIkZpYnJvYmxhc3QiLCJGaWJyb2JsYXN0IiwiQ3ljbGluZ0ZpYnJvYmxhc3QiLCJGaWJyb2JsYXN0IiwiQ2hvbmRyb2N5dGUiLCJCYXNhbCIsIlNjaHdhbm4vTmV1cmFsIiwiRmlicm9ibGFzdCIsIlNlY3JldG9yeSIsIk1lc2VuY2h5bWFsUHJvZ2VuaXRvciIsIlN0ZW0iLCJGaWJyb2JsYXN0IiwiQ2lsaWF0ZWQiLCJGaWJyb2JsYXN0IiwiQ2hvbmRyb2N5dGUiLCJJbW11bmUiLCJNdXNjbGUiLCJNdXNjbGUiLCJMeW1waGF0aWNFbmRvdGhlbGlhbCIpKQpgYGAKCmBgYHtyfQpIc19HQTIxMjNfVHJhY2hlYV92MzwtQWRkTWV0YURhdGEob2JqZWN0ID0gSHNfR0EyMTIzX1RyYWNoZWFfdjMsIG1ldGFkYXRhID0gSHNfdjNfdHlwZV9zdWIxLCBjb2wubmFtZSA9ICJzcGVjaWZpY190eXBlIikKYGBgCmBgYHtyfQp0YWJsZShIc19HQTIxMjNfVHJhY2hlYV92M0BtZXRhLmRhdGEkc3BlY2lmaWNfdHlwZSkKYGBgCgpgYGB7cn0KSHNfR0EyMTIzX1RyYWNoZWFfdjNAbWV0YS5kYXRhJHNwZWNpZmljX3R5cGUgPC0gaWZlbHNlKGlzLm5hKEhzX0dBMjEyM19UcmFjaGVhX3YzQG1ldGEuZGF0YSRzcGVjaWZpY190eXBlKSwgYXMuY2hhcmFjdGVyKEhzX0dBMjEyM19UcmFjaGVhX3YzQG1ldGEuZGF0YSRjZWxsX3R5cGUpLCBhcy5jaGFyYWN0ZXIoSHNfR0EyMTIzX1RyYWNoZWFfdjNAbWV0YS5kYXRhJHNwZWNpZmljX3R5cGUpKQpgYGAKCiMjIyMjIG5vdyB3ZSBoYXZlIGFubm90YXRpb24gZm9yIGFsbCBjZWxsczoKYGBge3J9CnRhYmxlKEhzX0dBMjEyM19UcmFjaGVhX3YzQG1ldGEuZGF0YSRzcGVjaWZpY190eXBlKQpgYGAKCgpgYGB7cixmaWcuaGVpZ2h0PTIwLGZpZy53aWR0aD02MH0KRG9IZWF0bWFwKG9iamVjdCA9IEhzX0dBMjEyM19UcmFjaGVhX3YzLCBnZW5lcy51c2UgPSBjKCJDRlRSIiwiQU5PMSIsIkVQQ0FNIiwiVFA2MyIsIktSVDUiLCJGT1hONCIsIlNISVNBOCIsIk1DSURBUyIsIlNOVE4iLCJDREhSMyIsIkZPWEoxIiwiTVVDMTYiLCJNVUMxIiwiTVVDNCIsIk1VQzIwIiwiU0VSUElOQjMiLCJDRDkiLCJLUlQxNCIsIlNPU1REQzEiLCJNVUM1QiIsIlNQREVGIiwiUk5BU0UxIiwiTFlaIiwiU05BUDI1IiwiQVNDTDEiLCJQTFAxIiwiTVBaIiwiRkNFUjFHIiwiQzFRQSIsIlBFQ0FNMSIsIkxZVkUxIiwiQUNUQTIiLCJSR1M1IiwiTk9UQ0gzIiwiU09YOSIsIkNPTDJBMSIsIkFDQU4iLCJXTlQyIiwiVEhZMSIsIlRXSVNUMiIsIk1LSTY3IiksIAogICAgc2xpbS5jb2wubGFiZWwgPSBUUlVFLCBncm91cC5sYWJlbC5yb3QgPSBUUlVFLHVzZS5zY2FsZWQgPSBULGdyb3VwLmJ5PSJzcGVjaWZpY190eXBlIixncm91cC5jZXggPSAzMCxjZXgucm93PTMwLGdyb3VwLm9yZGVyID0gYygiQmFzYWxfU0UiLCJDaWxpYXRlZF9Gb3huNCIsIkNpbGlhdGVkIiwiU2VjcmV0b3J5X1NFIiwiQmFzYWxfU01HIiwiU2VjcmV0b3J5X1NNRyIsIk15b2VwaXRoZWxpYWwiLCJFcGNhbV9FQ00iLCJTdGVtIiwiU2Nod2Fubi9OZXVyYWwiLCJJbW11bmUiLCJWYXNjdWxhckVuZG90aGVsaWFsIiwiTHltcGhhdGljRW5kb3RoZWxpYWwiLCJNdXNjbGUiLCJDaG9uZHJvY3l0ZSIsIk1lc2VuY2h5bWFsUHJvZ2VuaXRvciIsIkZpYnJvYmxhc3QiLCJDeWNsaW5nRmlicm9ibGFzdCIpCiAgKQpgYGAKCmBgYHtyfQpwcmludChsZXZlbHMoSHNfR0EyMTIzX1RyYWNoZWFfdjNAaWRlbnQpKQpgYGAKCmBgYHtyLGZpZy5oZWlnaHQ9NixmaWcud2lkdGg9MTJ9CkhzX0dBMjEyM19UcmFjaGVhX3YzPC1TZXRBbGxJZGVudChvYmplY3QgPSBIc19HQTIxMjNfVHJhY2hlYV92MywgaWQgPSAic3BlY2lmaWNfdHlwZSIpCkhzX0dBMjEyM19UcmFjaGVhX3YzQGlkZW50ID0gZmFjdG9yKEhzX0dBMjEyM19UcmFjaGVhX3YzQGlkZW50LGxldmVscyhIc19HQTIxMjNfVHJhY2hlYV92M0BpZGVudClbYygxLDE1LDUsNCwyLDE2LDEzLDcsMTcsMTQsOSwxMCwxOCwxMiwzLDExLDgsNildKQoKYGBgCgpgYGB7cixmaWcuaGVpZ2h0PTUsZmlnLndpZHRoPTEyfQpEb3RQbG90KG9iamVjdCA9IEhzX0dBMjEyM19UcmFjaGVhX3YzLCBjb2xzLnVzZSA9IGMoImxpZ2h0Z3JheSIsInJlZCIpLGdlbmVzLnBsb3QgPSBjKCJDRlRSIiwiQU5PMSIsIkVQQ0FNIiwiVFA2MyIsIkZPWE40IiwiU0hJU0E4IiwiTUNJREFTIiwiU05UTiIsIkNESFIzIiwiRk9YSjEiLCJNVUMxNiIsIlNFUlBJTkIzIiwiU09YOSIsIktSVDE0IiwiU09TVERDMSIsIk1VQzVCIiwiU1BERUYiLCJMVEYiLCJMWVoiLCJBQ1RBMiIsIlBPVTVGMSIsIkVTUkciLCJTTkFQMjUiLCJDSEdBIiwiUExQMSIsIk1QWiIsIkZDRVIxRyIsIkMxUUEiLCJQRUNBTTEiLCJMWVZFMSIsIk1ZSDExIiwiUkdTNSIsIk5PVENIMyIsIkNPTDJBMSIsIkFDQU4iLCJXTlQyIiwiQ0QzNCIsIlRIWTEiLCJUV0lTVDIiLCJNS0k2NyIpLGdyb3VwLmJ5ID0gImlkZW50IiwgeC5sYWIucm90ID0gVCxwbG90LmxlZ2VuZCA9IFQpCmBgYAoKYGBge3IsZmlnLmhlaWdodD01LGZpZy53aWR0aD0xNH0KRG90UGxvdChvYmplY3QgPSBIc19HQTIxMjNfVHJhY2hlYV92MywgY29scy51c2UgPSBjKCJmb3Jlc3RncmVlbiIsIm1hZ2VudGEzIiksZ2VuZXMucGxvdCA9IGMoIkNGVFIiLCJBTk8xIiwiRVBDQU0iLCJUUDYzIiwiS1JUNSIsIkZPWE40IiwiU0hJU0E4IiwiTUNJREFTIiwiU05UTiIsIkNESFIzIiwiRk9YSjEiLCJNVUMxNiIsIlNFUlBJTkIzIiwiU09YOSIsIktSVDE0IiwiU09TVERDMSIsIk1VQzVCIiwiTVVDNUFDIiwiU1BERUYiLCJMVEYiLCJMWVoiLCJBQ1RBMiIsIlBPVTVGMSIsIkVTUkciLCJTTkFQMjUiLCJDSEdBIiwiUExQMSIsIk1QWiIsIkZDRVIxRyIsIkMxUUEiLCJQRUNBTTEiLCJMWVZFMSIsIk1ZSDExIiwiUkdTNSIsIk5PVENIMyIsIkNPTDJBMSIsIkFDQU4iLCJXTlQyIiwiUEkxNiIsIkNEMzQiLCJUSFkxIiwiVFdJU1QyIiwiTUtJNjciKSxncm91cC5ieSA9ICJpZGVudCIsIHgubGFiLnJvdCA9IFQscGxvdC5sZWdlbmQgPSBULGNvbC5taW4gPSAtMixjb2wubWF4ID0gMikKYGBgCgpgYGB7cixmaWcuaGVpZ2h0PTYsZmlnLndpZHRoPTh9CkRvdFBsb3Qob2JqZWN0ID0gSHNfR0EyMTIzX1RyYWNoZWFfdjMsIGNvbHMudXNlID0gYygiZm9yZXN0Z3JlZW4iLCJtYWdlbnRhMyIpLGdlbmVzLnBsb3QgPSBjKCJGT1hKMSIsIkxURiIsIlRQNjMiLCJXTlQyIiwiUEkxNiIsIkNMRUMzQiIsIkVQQ0FNIiwiVEVSQyIsIlRFUlQiLCJDTERONiIsIlBPVTVGMSIsIkxJTjI4QSIsIkVTUkciLCJMMVREMSIsIkRQUEE0IiwiVVRGMSIsIkZPWEQzLUFTMSIsIkNSQUJQMSIsIlRIWTEiLCJUVUJCMkIiLCJVQ0hMMSIsIlRVQkIzIiwiU05BUDI1IiwiUExQMSIpLGdyb3VwLmJ5ID0gImlkZW50IiwgeC5sYWIucm90ID0gVCxwbG90LmxlZ2VuZCA9IFQpCmBgYAoKYGBge3J9CmRmX0hzPC1GZXRjaERhdGEoSHNfR0EyMTIzX1RyYWNoZWFfdjMsYygiQU5PMSIsIkNGVFIiLCJTRVJQSU5CMyIsIk1VQzE2Iiwic3BlY2lmaWNfdHlwZSIpKQoKYGBgCgpgYGB7ciwgZmlnLmhlaWdodD0zLCBmaWcud2lkdGg9MTB9CmdncGxvdChkZl9IcyxhZXMoc3BlY2lmaWNfdHlwZSxDRlRSKSkrZ2VvbV9kb3RwbG90KGJpbmF4aXM9InkiLGFlcyhmaWxsPXNwZWNpZmljX3R5cGUpLGJpbndpZHRoPTAuMDUsc3RhY2tkaXI9ImNlbnRlciIscG9zaXRpb249cG9zaXRpb25fZG9kZ2UoMC44KSwgZG90c2l6ZT0wLjAxOCkrIHRoZW1lKGF4aXMudGV4dC54ID0gZWxlbWVudF90ZXh0KGFuZ2xlID0gNDUsaGp1c3Q9MSkpKyBzdGF0X3N1bW1hcnkoYWVzKGNvbG9yPXNwZWNpZmljX3R5cGUpLGZ1bi5kYXRhPW1lYW5fc2RsLCBmdW4uYXJncyA9IGxpc3QobXVsdD0xKSwgCiAgICAgICAgICAgICAgICAgZ2VvbT0icG9pbnRyYW5nZSIscG9zaXRpb249cG9zaXRpb25fZG9kZ2UoMC43KSkKYGBgCgpgYGB7cixmaWcud2lkdGg9MTAsZmlnLmhlaWdodD02fQpUU05FUGxvdChvYmplY3QgPSBIc19HQTIxMjNfVHJhY2hlYV92MywgZG8ubGFiZWwgPSBGLGdyb3VwLmJ5PSJzcGVjaWZpY190eXBlIixwdC5zaXplID0gMC4zKStzY2FsZV9jb2xvcl9tYW51YWwodmFsdWVzPWMoJyNlNjE5NGInICwgJyM4MDgwODAnLCcjM2NiNDRiJywgJyNmZmUxMTknLCAnIzQzNjNkOCcsICcjOTExZWI0JywgJyM0NmYwZjAnLCAnI2YwMzJlNicsICcjYmNmNjBjJywgJyMwMDgwODAnLCAnI2U2YmVmZicsICcjOWE2MzI0JywgJyNmYWJlYmUnLCAgJyM4MDAwMDAnLCAnI2FhZmZjMycsICcjODA4MDAwJywnI2ZmZDhiMScsICcjMDAwMDc1JywgJyNmNTgyMzEnLCAnIzAwMDAwMCcsJyNmZmZhYzgnCikpCgpgYGAKCiMjIyMjIEZvciB0aGUgcHVycG9zZSBvZiB2aXN1YWxpemF0aW9uLCB3ZSBhdmVyYWdlIHdpdGhpbiBlYWNoIHNwZWNpZmljIGNlbGwgdHlwZToKYGBge3J9CkhzX0dBMjEyM19UcmFjaGVhX3YzPC1TZXRBbGxJZGVudChvYmplY3QgPSBIc19HQTIxMjNfVHJhY2hlYV92MywgaWQgPSAic3BlY2lmaWNfdHlwZSIpCmF2ZXJhZ2VfSHNfc3BlY2lmaWNfQW5ub3RhdGlvbjwtQXZlcmFnZUV4cHJlc3Npb24ob2JqZWN0ID0gSHNfR0EyMTIzX1RyYWNoZWFfdjMscmV0dXJuLnNldXJhdCA9IFQpCmBgYAoKYGBge3IsZmlnLmhlaWdodD0xNSxmaWcud2lkdGg9MTV9CgpEb0hlYXRtYXAob2JqZWN0ID0gYXZlcmFnZV9Ic19zcGVjaWZpY19Bbm5vdGF0aW9uLCBnZW5lcy51c2UgPSBjKCJFUENBTSIsIlRQNjMiLCJLUlQ1IiwiRk9YTjQiLCJTSElTQTgiLCJNQ0lEQVMiLCJTTlROIiwiQ0RIUjMiLCJGT1hKMSIsIk1VQzE2IiwiU0VSUElOQjMiLCJTT1g5IiwiS1JUMTQiLCJTT1NUREMxIiwiTVVDNUIiLCJNVUM1QUMiLCJTUERFRiIsIkxURiIsIkxZWiIsIkFDVEEyIiwiTVlIMTEiLCJQT1U1RjEiLCJFU1JHIiwiU05BUDI1IiwiQVNDTDEiLCJDSEdBIiwiUExQMSIsIk1QWiIsIkZDRVIxRyIsIkMxUUEiLCJQRUNBTTEiLCJMWVZFMSIsIlJHUzUiLCJOT1RDSDMiLCJDT0wyQTEiLCJBQ0FOIiwiV05UMiIsIlBJMTYiLCJDRDM0IiwiVEhZMSIsIlRXSVNUMiIsIk1LSTY3IiwiQ0ZUUiIsIkFOTzEiKSwgCiAgICBzbGltLmNvbC5sYWJlbCA9IFRSVUUsIGdyb3VwLmxhYmVsLnJvdCA9IFRSVUUsdXNlLnNjYWxlZCA9IFQsZ3JvdXAuY2V4ID0gMzAsY2V4LnJvdz0yMCxncm91cC5vcmRlciA9IGMoIkJhc2FsX1NFIiwiQmFzYWxfU01HIiwiQ2lsaWF0ZWRfRm94bjQiLCJDaWxpYXRlZCIsIlNlY3JldG9yeV9TRSIsCiAiU2VjcmV0b3J5X1NNRyIsICJNeW9lcGl0aGVsaWFsIiwiRXBjYW1fRUNNIiwiU3RlbSIsIlNjaHdhbm4vTmV1cmFsIiwiSW1tdW5lIiwiTHltcGhhdGljRW5kb3RoZWxpYWwiLCJWYXNjdWxhckVuZG90aGVsaWFsIiwiTXVzY2xlIiwiQ2hvbmRyb2N5dGUiLCJNZXNlbmNoeW1hbFByb2dlbml0b3IiLCJGaWJyb2JsYXN0IiwiQ3ljbGluZ0ZpYnJvYmxhc3QiKSkKYGBgCgoKYGBge3J9CnNhdmUoSHNfR0EyMTIzX1RyYWNoZWFfdjNfc3ViMSxmaWxlPSJzZXVyYXRfR0EyMTIzd2tfdjNfc3ViMS5SRGF0YSIpCmBgYApgYGB7cn0Kc2F2ZShIc19HQTIxMjNfVHJhY2hlYV92MyxmaWxlPSJzZXVyYXRfR0EyMTIzd2tfdjMuUkRhdGEiKQpgYGAKYGBge3J9CmxvYWQoZmlsZT0ic2V1cmF0X0dBMjEyM3drX3YzLlJEYXRhIikKYGBgCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgo=